在运行时lisp中创建lambda函数

时间:2014-11-03 16:53:16

标签: lambda lisp

让我们说我有一个功能" 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))>

这可能吗?

1 个答案:

答案 0 :(得分:1)

最终结果并不重要,因为xy在词汇范围内绑定到23。你说你不想要:

(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的整个事件,副作用发生在调用时。