【发布时间】:2014-04-11 01:11:28
【问题描述】:
这里有一些来自 OnLisp 文本的示例代码。 我的问题是为什么要使用 lambda 函数,
`(funcall (alrec ,rec #'(lambda () ,base)) ,@lsts))
作为 on-cdrs 定义中 alrec 的第二个参数?
如果我只定义它而不使用 lambda 有什么区别?
`(funcall (alrec ,rec ,base) ,@lsts))
(defun lrec (rec &optional base)
(labels ((self (lst)
(if (null lst)
(if (functionp base)
(funcall base)
base)
(funcall rec (car lst)
#'(lambda ()
(self (cdr lst)))))))
#'self))
(defmacro alrec (rec &optional base)
"cltl2 version"
(let ((gfn (gensym)))
`(lrec #'(lambda (it ,gfn)
(symbol-macrolet ((rec (funcall ,gfn)))
,rec))
,base)))
(defmacro on-cdrs (rec base &rest lsts)
`(funcall (alrec ,rec #'(lambda () ,base)) ,@lsts))
【问题讨论】:
-
lrec的参数是函数。alrec将它的第二个参数传递给lrec,所以它必须是一个函数。 -
@Barmar:不妨将您的评论变成答案,因为它是一个。
标签: common-lisp