gpt4 book ai didi

lambda - 在运行时 lisp 中创建 lambda 函数

转载 作者:太空宇宙 更新时间:2023-11-03 19:00:42 25 4
gpt4 key购买 nike

假设我有一个定义如下的函数“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))>

这可能吗?

最佳答案

这对最终结果并不重要,因为 xy 在词法范围内绑定(bind)到 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 的全部内容,并且副作用会在调用时发生。

关于lambda - 在运行时 lisp 中创建 lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26718985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com