gpt4 book ai didi

lambda - 将 lambda 绑定(bind)到函数或 var 在语义上更正确吗?

转载 作者:行者123 更新时间:2023-12-01 06:13:35 26 4
gpt4 key购买 nike

我正在编写一个简单的宏,它将一个名称绑定(bind)到一个返回 lambda 的表达式,但是由于常见的 lisp 具有对于函数和值不同的 namespace ,我需要 funcall 它不管我是将它包装在 defun 还是 defvar 中。

(defun foo () (lambda-returning-expr)) 
(defvar bar (lambda-returning-expr))

(funcall (foo)) ; evaluates correctly
(funcall bar) ; also evaluates

那么哪种方法更正确呢?或者更确切地说,lispers 最喜欢哪个?

最佳答案

(defun foo () (lambda-returning-expr)) 
(defvar bar (lambda-returning-expr))

这两种情况都需要 funcall,例如 (funcall (foo))(funcall bar),但是有一个 非常 很大的区别在于 (foo) 涉及每次评估 (lambda-returning-expr) 的额外函数调用,因此您可以获得不同的结果每次都返回功能。

  • 如果您预计可能会有不同的函数,那么使用像 foo 这样的函数是合适的。
  • 如果您只需要一个,那么变量(如 bar)将是合适的。
  • 如果您希望用户想要更改功能(例如,使用 (let ((bar …)) ...) 作为 API 的一部分,那么一个变量肯定是有意义的。这在标准中使用,例如 *macroexpand-hook* 。如果你需要这样做,那么特殊变量几乎肯定是要走的路,因为 Common Lisp 没有动态范围的函数.

最近其实也有类似的Scheme题,Differences between two similar definitions ,其中讨论了其中一些问题。

关于lambda - 将 lambda 绑定(bind)到函数或 var 在语义上更正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29434470/

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