在On Lisp,p.267,Paul Graham提供了一个继续传递宏的实现:
(setq *cont* #'identity)
(defmacro =lambda (parms &body body)
`#'(lambda (*cont* ,@parms) ,@body))
(defmacro =defun (name parms &body body)
(let ((f (intern (concatenate 'string
"=" (symbol-name name)))))
`(progn
(defmacro ,name ,parms
`(,',f *cont* ,,@parms))
(defun ,f (*cont* ,@parms) ,@body))))
(defmacro =bind (parms expr &body body)
`(let ((*cont* #'(lambda ,parms ,@body))) ,expr))
(defmacro =values (&rest retvals)
`(funcall *cont* ,@retvals))
Run Code Online (Sandbox Code Playgroud)
以下代码遍历树t2的每个叶子的树t1,使用此实现,我想知道restart调用时会发生什么,特别是在t1从A(第一个元素)更改为B(第二个元素)的叶子之后.当restart被调用时,它只是从弹出lambda函数*saved*,而lambda函数调用dft-node …
对我来说,这些运营商似乎做了同样的事情.两者都采用符号并返回与之关联的函数.有什么区别吗?
elisp 评估返回以下内容:
(defun foo(x)(+ 1 x))
foo
(foo 3)
4
#'foo
我也不明白.
常见的lisp和elisp有区别吗?我正在从中学习资源.