![]() |
1
5
在像McCarthy的LISP机器这样的机器上尝试这样做的问题是,没有办法阻止在运行时进行参数计算,也没有办法在编译时进行更改(宏就是这样做的:基本上,它们在编译之前重新排列代码)。 但这并不能阻止我们在麦卡锡的机器上重写运行时的代码。诀窍是引用我们传递给“宏”的参数,这样它们就不会被计算。
作为一个例子,让我们看一个我们可能想要的函数;
一些例子(在Clojure的语法中,但这并没有改变任何东西):
所以一开始我们可能想写
这似乎很管用:
有了麦卡锡的口齿不清,一切正常。问题是,在现代的Lisps中,我们不仅仅有没有副作用的代码,因此所有参数都传递给
所以我们想要
但我们可以
所以我们有一个新的
我们使用的方式有点不同:
但这不是
我希望我已经回答了你的问题,而不是试图定义一个体面的
|
![]() |
2
2
读取部分查看每个读取的元素并对其执行操作:
要解释宏,只需(?)需要实现一个函数,将宏的模板文本放在存储器的某个地方,一个repl循环的谓词——这意味着简单地定义一个函数——它说“哦,这是一个宏!”,然后将模板文本复制回读取器中,以便对其进行解释。 计算机程序的结构与解释 Lisp in Small PIeces . |
![]() |
lightning_missile · 词法范围和共享对象 6 年前 |
![]() |
Alexandru Popa · SBCL中奇怪的宏扩展错误 6 年前 |
![]() |
Jacky · 编辑列表中的每个偶数索引元素 6 年前 |
![]() |
HappyFace · lisp典型缩进约定背后的规则是什么? 6 年前 |
![]() |
Jorge · 在公共Lisp中初始化计数器变量 6 年前 |
![]() |
Rorschach · cl循环破坏性修改cons单元 7 年前 |