问题标签 [lisp-macros]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
1432 浏览

clojure - 如何将 :arglists 修改为 Clojure fn 或宏?

如何修改 clojure fn 或宏的 :arglist 属性?

好的,那里没有运气,所以我尝试执行以下操作。

嗯,所以现在 :arglists 键不见了?好吧,我放弃了,我该怎么做?我只想修改 :arglists 的值。上面的示例使用了 defn,但我也想知道如何使用宏 (defmacro) 设置 :arglists。

0 投票
1 回答
118 浏览

emacs - 在宏中替换符号名称

如何将符号名称替换为宏中创建的函数?我想我在这里遗漏了一些明显的东西。例如,我正在尝试制作一个宏来定义一些类似于以下的变量和函数,

返回的函数调用另一个函数 ( fn),其签名如下

所以,它期待一个像(fn 'some-var). 而且,我希望能够使用宏

并有以下工作,

我已经尝试过(quote ,sym),symbol-name和其他...但似乎无法正确处理。

0 投票
1 回答
113 浏览

emacs - 有条件地删除 lisp 宏中的 let-binding

如何有条件地删除defun在 lisp 宏中创建的 let 绑定?在这里,我想从结果函数中删除第一个 let-bound 变量,但是遇到了一个问题,即我有一个nil在 let 绑定中存在的问题,从而导致错误。

例如,生成的函数使用letorlet*并且应该删除第一个变量赋值,具体取决于arg. 但是我写问题的方式来自替换var1nil. 我不知道如何摆脱零。

0 投票
2 回答
469 浏览

emacs - Elisp:加载时使用未定义变量评估的宏扩展

Lisp 新手在这里。

我的目标是定义一个宏,它将使点列表的键可用作变量以访问相应的值,因此名称为»let-dotted-alist«。所以我想要的是:

这是迄今为止我能想到的最好的:

这里的问题是eval. 我需要它以便能够将 alist 作为变量 ( foo) 而不是文字传递,这是定义函数时的主要用例。为了让宏计算出代码,这个变量需要已经绑定。我仍然在任何地方读到使用 eval 往往表明代码中存在缺陷?有办法解决吗?

如果 Emacs 24 没有引入想要在加载时扩展宏的急切宏扩展,这将是一个有点学术问题,dotlist而应该提供 alist 的变量(在以下示例中)仍然是无效的:

根据我对此的评估方式,我要么得到»mapcar:符号作为变量的值是 void:dotlist«,要么得到 »Eager 宏扩展失败:(void-variable dotlist)«。这当然是有道理的,因为变量 dotlist 在加载时确实是无效的。

现在,在我尝试找到(本地)禁用急切宏扩展的解决方法之前,有没有办法改进宏定义以eval完全避免这种情况?

0 投票
2 回答
501 浏览

emacs - 使用字符串变量作为宏参数

我想要这个代码:

做同样的事情:

我试过这个(来自这个问题):

但是我得到了一个名为 my-name-function 的函数,但我想要 my-foobar-function。我的目标是从键盘映射列表中定义未成年人模式。

谢谢

0 投票
2 回答
205 浏览

closures - 如何编译出 Pandoric 宏中的符号?

我已经阅读了LOL的第 6.7 节几次,但我仍然无法理解以下内容。

以前对外部代码关闭的绑定现在对我们开放供我们修改,即使这些绑定被编译为有效的东西并且早已忘记了它们的访问器符号。

如果绑定符号本质上被编译为闭包环境中的指针,那么如何将符号传递给已经编译的函数,并且函数能够以某种方式比较符号?

我一直在搞乱pantestclisp 中的示例,我可以看到我能够同时更改accthisinside pantest。我可以编译和反汇编pantest,但所有符号都显示在环境中。如果我有一个可以编译成汇编的 lisp,我可能会获得更多的直觉,但代码足够复杂,如果没有解释可能很难理解。

0 投票
0 回答
42 浏览

python - 如何使用已经编译的 Emacs 宏?

我正在尝试修改 python 主要模式以使其工作方式略有不同。具体来说,我想更改python-indent-region。我相信我已经弄清楚我需要做出什么改变(它涉及将 #1070 行更改为(beginning-of-line))。我试图通过将函数复制到我的 init.el 文件并更改该行来更改它。但是,当我尝试使用该功能时,我收到以下错误:

我做了一些研究,看起来问题实际上是在 python.el 中python-rx使用 a 定义的。defmacro由于 python.el 与 emacs 一起分发,因此它已经编译并且似乎驻留在/usr/share/emacs/24.5/lisp/progmodes/python.elc. 我在这里阅读有关宏编译的信息,据我了解,宏已被编译,因此当我尝试引用它时它不再可用。

这归结为两个问题:

  1. 我的上述理解是否正确?
  2. 尽管事实上它依赖于宏,但我如何才能实现将这个函数重新定义为大致相同的目标python-rx

提前感谢您的帮助!

0 投票
1 回答
54 浏览

common-lisp - 为什么在编译函数定义(Clozure Common Lisp)时要评估宏?

我有:

当我编译操作码调用时,REPL 输出:

为什么在编译时评估分配?

0 投票
2 回答
1052 浏览

common-lisp - How do setf works under the hood?

Currently learning common lisp, following Peter Seibel's Practical Common Lisp (i'm at chapter 11, about collections), i have difficulties to understand how setf works behind the hood.

Considering this expression :

I completely understood how the interpreter can (1) retrieve the variable named a, and (2) change the value it points to to 10.

Now, i case of particular collections, for instance lists, vectors or hash tables, setf can also be used to change values contained by the collection. For instance, with a vector :

This makes me suspicious about setf, because it is eventually finding non-trivially accessible information, or making black magic. I see multiple possibilities.

1. setf is a function

The (elt *x* 1) expression is returning 'b, so setf is virtually working with (setf b bb). I then do not understand how setf can infer which object (here, the list *x*) it must modify, without having the return value of elt holding both an indication that it comes from a collection, and a pointer to the said collection. Seems complicated.

2. setf is a macro

The idea is, as setf is a macro, it works directly with the (setf (elt *x* 1) bb) and therefore can extract the elt *x* 1 part to infer which object/collection is used, and therefore must be modified.

It do not seems very efficient, nor reliable, nor resistant to complex operations. However, since i'm unable to run this code :

This make me think that setf is a macro implementing a very simple heuristic to retrieve the function to call, and all other needed information. Seems complicated.

3. setf is a special case of interpretation

Another way to go could be to have setf be handled differently by the interpreter itself, dealing with some black magic to implement properly the expected behavior. Seems complicated.

4. there is something i do not know about lisp

Probably the real answer. What did i miss ?

Bonus question : is the implementation method dependent of the lisp interpreter implementation ? (or, more simply, what exactly the common lisp standard define about setf implementation) I'm currently using clisp but insights on others implementations are welcome.

0 投票
1 回答
101 浏览

time - 使用宏定义计算 10 个复活节相关日期的函数

我目前正在通过 Graham 的书“ANSI Common Lisp”学习 lisp,作为练习,我正在编写基于儒略日的日历计算。如您所知,复活节星期日每年都在变化,还有大约 10 个其他特殊日子,其实际日期取决于复活节星期日的日期。

我想为这些日子的每一天定义一个函数,所有这些都遵循以下模式:

与其重复 10 次类似的声明,不如使用宏:

(开始%标志着我不打算在定义宏的包中导出宏。)

该宏可用于为日期基于东部星期日日期的每一天定义一个函数:

现在,为了练习,我想将所有数据打包到一个列表中,并%defeasterday在其项目上使用宏。我的尝试是

这失败了

这告诉我宏不仅仅是“将代码映射到代码的函数”,因为apply它对运行它们很挑剔。

如何使用%defeasterday上面的宏来迭代列表?

easter(如果您出于测试目的需要临时功能,请(defun easter () 2457860)给出 2017 年的预期答案。)