(mymacro arg) 和 (eval (myfunc (quote arg))) 有什么区别

问题描述 投票:0回答:1

我在 Lisp 中“看到”宏的方式如下:每当我看到宏调用

(mymacro arg1 arg2 ... argn)
时,我认为它与
(eval (myfun (quote arg1) (quote arg2) ... (quote argn)))
相同,其中 myfun 是一个函数,其主体与 完全相同相同mymacro 的主体。我认为这是理解宏的一种过于简单化的方式。但我很难找到失败的例子。

那么,是否有 s 表达式 BODY 和 ARG 的示例,使得给出以下

mymacro
myfun
的定义,

(defmacro mymacro (param) BODY) 
(defun    myfun   (param) BODY)

表达方式

(mymacro ARG)
(eval (myfun (quote ARG)))
评估出相同的结果吗?

PS:我只使用一个参数,所以写这个问题更容易,但我显然对具有多个参数的示例没意见。

PS:我对最后的语义差异更感兴趣,而不是实现细节、性能差异等。

macros lisp eval
1个回答
0
投票

如果扩展引用局部变量,情况会有所不同,因为

eval
在全局环境中计算表达式。

这是一个宏,它是标准

INCF
宏的简化版本。

(defun increment-func (variable) 
  `(setq ,variable (1+ ,variable)))

(defmacro increment (variable) 
  (increment-func variable))

(let ((foo 1))
  (increment foo)
  (print foo))

(let ((foo 1))
  (eval (increment-func 'foo)))

第一次使用会工作并打印

2
,第二次使用会抱怨
FOO
未绑定。

© www.soinside.com 2019 - 2024. All rights reserved.