在运行时lisp中创建lambda函数
假设我有一个函数“create 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
(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
的值(除非它们已被全局声明为特殊值),因此应该没有明显的差异。