让我们说我有一个功能" create-lambda"定义如下:
(defun create-lambda(x y)
(lambda(z) (let ((foo (some-other-function z y))) (if (= x foo) T))))
如果我调用此函数,就像这样:
(create-lambda 2 3)
它将返回:
#<FUNCTION :LAMBDA (Z) (LET ((FOO (SOME-OTHER-FUNCTION Z Y))) (IF (= X FOO) T))>
我想要的是,返回这个:
#<FUNCTION :LAMBDA (Z) (LET ((FOO (SOME-OTHER-FUNCTION Z 3))) (IF (= 2 FOO) T))>
这可能吗?
答案 0 :(得分:1)
最终结果并不重要,因为x
和y
在词汇范围内绑定到2
和3
。你说你不想要:
(let ((x 2) (y 3))
(let ((foo (some-other-function z y)))
(if (= x foo) T)))
但你想要:
(let ((foo (some-other-function z 3)))
(if (= 2 foo) T))
但我不能说出不同之处。你能? 无论如何。你可以coerce任何数据结构都是这样的函数:
(defun create-lambda (x y)
(coerce `(lambda(z)
(let ((foo (some-other-function z ,y)))
(when (= ,x foo) T)))
'function))
或者你可以让create-lambda成为一个宏:
(defmacro create-lambda (x y)
`(lambda(z)
(let ((foo (some-other-function z ,y)))
(when (= ,x foo) T))))
如果您使用副作用(create-lambda (print 3) (print 4))
调用它们,则很容易发现它们之间的差异。在第一个副作用将立即发生,因为函数评估所有他们的参数,而宏只会替换x和y的整个事件,副作用发生在调用时。