在运行时lisp中创建lambda函数

在运行时lisp中创建lambda函数,lambda,lisp,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) 如果我调用这个函数,如下所示: (defun create-lambda(x y) (lambda(z) (let ((foo (some-other-function z y))) (i

假设我有一个函数“create lambda”,定义如下:

(defun create-lambda(x y)
    (lambda(z) (let ((foo (some-other-function z y))) (if (= x foo) T))))
(create-lambda 2 3)
如果我调用这个函数,如下所示:

(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))>
#

这可能吗

这与最终结果无关,因为
x
y
在词法范围内被绑定到
2
3
。你是说你不想要:

(let((x2)(y3))
(let((foo(其他函数zy)))
(如果(=x foo)T)))
但是你想要:

(let((foo(其他一些函数z3)))
(如果(=2 foo)T))
但我看不出有什么区别。你能? 无论如何可以将任何数据结构转换为如下函数:

(defun create-lambda(x y)
    (lambda(z) (let ((foo (some-other-function z y))) (if (= x foo) T))))
(create-lambda 2 3)
(定义创建lambda(x y)
(强制)`(λ(z)
(let((foo(其他函数z,y)))
(当(,x foo)T)))
(功能)
或者,可以将“创建lambda”设置为宏:

(定义宏创建lambda(x y)
`(λ(z)
(let((foo(其他函数z,y)))
(当(,x foo)T)))

如果将其称为副作用,则很容易发现它们之间的差异
(创建lambda(打印3)(打印4))
。在第一种情况下,副作用会立即发生,因为函数会计算它们的所有参数,而宏只会替换x和y的全部内容,副作用会在调用时发生。

lambda函数的打印形式,例如,
#
。在这种情况下,由于不能更改
x
y
的值(除非它们已被全局声明为特殊值),因此应该没有明显的差异。