We’re rewarding the question askers & reputations are being recalculated! Read more.

Questions tagged [elisp-macros]

Emacs Lisp macros enable you to define new control constructs and other language features. A macro is defined much like a function, but instead of telling how to compute a value, it tells how to compute another Lisp expression, which in turn is evaluated to compute the value. We call this expression the "expansion" of the macro call. The macro call is first expanded and then evaluated, returning the value of that evaluation.

Filter by
Sorted by
Tagged with
0
votes
1answer
47 views

Is there a clean way to splice some args to an existing Lisp macro?

I have the following non-working elisp code: (use-package eglot ;; For debug/testing, load local copy of eglot if it exists ,@(if (file-directory-p (concat user-emacs-directory "/...
1
vote
1answer
54 views

Making a dynamic, interactive function

I have make a macro that creates dynamic functions: (defmacro tjb-make-register-macro (func-name out-string) (list 'defun func-name () '(interactive) (list 'insert out-string))) ;; This call ...
1
vote
0answers
33 views

does this routine exist? until (while until true)

I found myself needing this control loop and was very surprised not to find it in the standard library. Does it exist by some other name? (defmacro until (form &optional guard) "Runs `while' on ...
1
vote
1answer
18 views

How do you remove compiler warnings for macro usage when running macro with 'with-eval-after-load'?

In a package I am working on I want to define a flycheck checker only if the user has flycheck installed already. To do this, I am using the macro (with-eval-after-load "flycheck" ...) as follows: (...
4
votes
3answers
71 views

How do I get byte-compilation warnings about undefined variables?

The following code works fine with M-x eval-buffer, and byte-compiles without any warnings. (eval-when-compile (defconst demo-one 1)) (defvar demo-some-var `(foo bar ,demo-one)) However, if I ...
6
votes
0answers
65 views

Evaluate some arguments to macro immediately

I am trying to call a macro (defined somewhere else; I can't change it), but I want to evaluate some of the arguments before the macro is expanded. Is this possible? For example: (defmacro foo (&...
1
vote
1answer
36 views

what is the macro “section”?

Exploring far-out init files, I found this here: (defmacro section (name &rest a) `(progn ,@a)) (put 'section 'lisp-indent-function 'defun) then it's used AFAICT as a sort of wrapper, not sure ...
1
vote
0answers
88 views

On using Elisp macros for partial application

I want to improve my Elisp, but despite reading about the differences between functions and macros (including discussions here in Emacs SE and on Reddit), I still find examples where the distinction ...
7
votes
1answer
415 views

Setf weird expansion

Trying to understand what setf can do, I called (macroexpand '(setf (aref vec i) val)) ⇒ (let* ((v vec) (v i)) (aset v v val)) This seems obviously wrong. However I couldn't create an actual ...
0
votes
1answer
55 views

How safe is “with-silent-modifications” to mask (hide) strings before and after buffer modification?

In my LaTeX code I want to replace one-line eqnarray environments with the equation environment. To do that I need to "count" the new-line (\\) strings in a region and I also need to ignore some new-...
0
votes
1answer
39 views

Byte-compilation and “uninterned” function names

Not quite a duplicate: this appears to be very similar to the situation described in an existing question. But my question is not "why does it happen", but rather "is there any way to keep using ...
0
votes
1answer
69 views

Forcing lexical-scope in the middle of dynamic-scope

Today I ran head first into lexical vs dynamic scope in Emacs Lisp. Gist of it is I have a macro defined in lexical scope that expands into a `defun'. Let's say something simple like this: ;; -*- ...
3
votes
3answers
289 views

How to avoid use of `lexical-let`

I have a macro that intends to creates a closure: ; -*- lexical-binding: t -*- (defmacro repro () (let ((kmap-sym (gensym "kmap-"))) `(let ((,kmap-sym (make-sparse-keymap))) (define-key ,...
0
votes
1answer
43 views

with-query-replace-color: macro or function?

I'm trying to create my first macro. I often change the background color of the query-replace matched string in my script. I usually do: (let* ((face 'query-replace) (bg (face-background face))...
0
votes
1answer
94 views

elips macro that return's the current file's filename

I want to define a action that says open <config file> within the actual config file itself. However, this config file may be in a different location on different computers. How can I get the ...
1
vote
1answer
41 views

macro takes multiple pairs of arguments

I found this snippet of code from oremacs (defmacro csetq (variable value) `(funcall (or (get ',variable 'custom-set) 'set-default) ',variable ,value)) I would like to expand this macro so that is ...
0
votes
1answer
37 views

Creating a macro/elisp function for HASH using calc

In my workflow, I need to do binary operations quite often. I am wondering if there is a clean way of creating macro/elisp-function to return value of following HASH function. Input 16bit hex number: ...
0
votes
1answer
102 views

Why doesn't this `declare-function` form suppress 'Warning: the function is not known to be defined.'?

Here's my declare-function form in file A: (declare-function 'my-function "file-B" (my-func-arg &optional args)) and here's the definition of my-function in file B: ;;;###autoload (defun my-...
1
vote
1answer
110 views

Unconsumed commas in double-backquoted lists

I'm writing a macro which calls a helper function. I need to return a list like this: `(s -- (cons 'commentary s)) I have tried many combinations, but I can't seem to get what I need without an ...
1
vote
0answers
41 views

Macro expansion inside quail-define-rules

Why can't I expand a macro inside (quail-define-rules)? (defmacro quail-test () `("c" ["success!"])) (quail-define-package "experiment" "Experiment" "X" t ...
0
votes
1answer
112 views

AUCTeX set LaTeX-default-tabular-environment back to “tabular”

When I use the package tabularx in a tex file, if I insert table environment, the inner environment will be given as tabularx instead of tabular when the package tabularx is not used. Normally this ...
4
votes
2answers
97 views

How can I define new places for setf?

Q: how do I teach setf about new places it can set? In common lisp, one uses the macro defsetf to tell setf about new places it can set. In elisp, that macro exists in in the cl library, but, as far ...
2
votes
1answer
106 views

improve AUCTeX macros like `\frac` and `\stackrel`

While using AUCTeX, the macro \frac is quite intelligent that when I just type C-c C-m frac RET, it will put the cursor in the first pair of braces, as \frac{(cursor here)}{} However, when I have ...
7
votes
1answer
193 views

“cl-flet” macro not allowing for recursive functions

I am used to the deprecated elisp macro flet and I was told to change to cl-flet. However upon making this change some of my elisp programs stopped working and I realized the reason is that, unlike ...
1
vote
1answer
62 views

Define negating pcase patterns

I am interested in extending pcase with patterns which: Complement an existing pattern, e.g. (not (pred string-empty-p)). Such a pattern would match where the non-negated form does not match and vice ...
2
votes
3answers
280 views

Eval some arguments in a macro

I want to make a macro that takes a form and returns a string with some parts of the form evaluated. The form can have any number of elements (e.g. additional options for the title font, color, size,.....
0
votes
1answer
58 views

prin1 abbreviates form with “…” despite expression-print-level?

I have the following function to produce a form that can be "printed" to a ~/.gnus file to configure gnus to use a certain stmp and imap server for an account: (defun gnus-imap-smtp-form (email smtp-...
8
votes
1answer
347 views

eval-when-compile: defsubst vs defmacro vs define-inline

I defined some simple functions in init.el, for example my-cache-file: (defconst my-cache-directory (expand-file-name ".cache" user-emacs-directory)) ; ~/.emacs/.cache (defun my-cache-file (x) (...
-1
votes
1answer
44 views

Writing a macro that generates a (cons atom (cons atom … ))) list

I am relatively new to elisp, and am currently in need of a macro that will take in a list, and return, not a cons-list, but: given (1 2 3 4) returns (cons 1 (cons 2 (cons 3 4))) Any help would be ...
2
votes
2answers
159 views

Why does my function-generating macro only work when I evaluate its expansion?

I'm trying to write a macro that will define a function exactly once where I don't really care what the name of the function is. My thought was to generate a symbol, use defun with that, and then put ...
4
votes
2answers
71 views

How can I record where a function is defined if it's done indirectly?

I've got a few functions in api-wrap.el that I'll refer to as 'macro code', here simplified to clarify the question: function (generate-form prefix kind &rest args) returns an unevaluated form ...
1
vote
1answer
183 views

How can I syntax-highlight a function like a macro?

I've got a function that behaves more like a macro in that it does compile-time environment definitions. For various reasons (at this point, one of those reasons is 'because it is easier to grok in ...
2
votes
1answer
253 views

Using local variables in cl-loop

This is my first time trying to write my own elisp code, so bear with me. I have the following cl-loop: data contains the following: ((refs . [((file . "api/user.js") (start . 266) (end . 269)) ((...
1
vote
1answer
436 views

Passing a symbol as an argument to a function

I'm trying to understand why this doesn't work, and how to make it work: (defvar test/var-1 nil) (defvar test/var-2 nil) (defun make-setter (var-to-set) (lambda (val-to-set) (setq var-to-set ...
1
vote
0answers
504 views

Understanding Emacs macro and org mode tikz behavior

I found this discussion, and the last response gives this code: #+TITLE: Test #+AUTHOR: Blah #+LATEX_CLASS: article #+LATEX_CLASS_OPTIONS: [american] # # Setup tikz package for both LaTeX and HTML ...
4
votes
2answers
177 views

Deep eager macroexpansion

This works: (require 'clojure-mode) (when (member 'clojure-mode my-packages) (define-clojure-indent (-> 1) (->> 1))) This gives the error Wrong type argument: listp, 1: (when (...
3
votes
2answers
198 views

One-time advice

I've been trying to a macro to put one-time advice on a function. What I mean by one-time advice is advice which removes itself after it is called – so that when you add the advice and run the ...
5
votes
2answers
194 views

Finding the source of a function after macro expansion?

(I'm a rookie and I use Spacemacs) I'm trying to find the source of a certain function*. I can find the .el file in which it's defined by using find-function, however the defun is created ...
1
vote
0answers
68 views

How do I teach edebug to only evaluate some macro arguments?

Currently, edebug doesn't understand the ->> macro in dash.el. (defun foo () (->> (+ 1 1) (+ 2) (* 3) (format "%s"))) C-u M-x edebug-eval-defun followed by M-: (...
1
vote
1answer
188 views

Weird behavior of defmacro and intern - symbolp error

I have the following macro (defmacro test-macro (arg) `(defun (intern (concat "test-func-called" ,arg)) () (message "I do nothing"))) When I call to this macro (test-macro "test") It gives ...
0
votes
0answers
55 views

with-accessors for all accessors?

common lisp has a with-accessors macro which is pretty useful but it is still prone to lots of code duplication. Is there a convenient let/binding macro that makes all accessors from a defclass ...
12
votes
3answers
967 views

When to use macro or not to use [closed]

When should I use macro in my program or not to? This question is inspired by an informative answer by @tarsius. I believe many have great experiences to share others. I hope this question become ...
3
votes
1answer
72 views

FORM vs BODY in documentation?

Recently I was trapped by void-variable error on eval-after-load. That is not first time I forget to quote args like: (eval-after-load 'sql '(progn ...)) because eval-after-load docs say: ...
3
votes
0answers
237 views

Byte-compiling a file loads macros with `(eval-and-compile)` but not `(eval-when-compile)`

I created a buffer, test1.el: (eval-when-compile (defmacro dummy-macro (_) nil) (dummy-macro s)) Trying to compile this file, I get the following errors: In toplevel form: test1.el:3:16:Warning:...
8
votes
1answer
222 views

Understanding uninterned symbols and macro expansion?

I want to demonstrate my lack of knowledge with an example. Using the following two macro defintions, (defmacro for (var from init to final do &rest body) "Execute a simple for loop: (for i ...
2
votes
1answer
384 views

Evaluating Macro Arguments in Expansion

In Section 13.5.4 of the Elisp reference, we are shown a problem whereby a macro definition evaluates one of its argument expressions. (defmacro foo (a) (list 'setq (eval a) t)) (setq x 'b) (foo x) ...
2
votes
1answer
108 views

Dynamic generation of varlist in a let form

Let's say I have a let form and I want to generate the varlist dynamically from another function. Something like this: (let ((x 1) (y 2) (the-dyn-gen)) body... ) I have some local ...
3
votes
1answer
153 views

Calling a macro from a macro with a variable number of arguments

Say there is a defmacro defined like this: (defmacro do-something (foo &optional bar) (...)) And then there is another one that calls it: (defmacro something-else (wat baz &optional bar) ...
6
votes
1answer
674 views

Make flycheck's “reference to free variable” work with macros

The use-package is a useful and popular macro for installing packages, but flycheck always complains about it since it hides variable definitions. For example, if I attempt (use-package org), Flycheck ...
0
votes
1answer
343 views

Fix for “Invalid function:” error when external function become a macro

For: (defun my-w3m-view-url () (interactive) (browse-url (w3m-anchor))) (eval-after-load 'w3m (define-key w3m-minor-mode-map (kbd "RET") #'my-w3m-view-url)) when byte-compiled I get error on ...