gpt4 book ai didi

common-lisp - flet 与 let+funcall 的区别

转载 作者:行者123 更新时间:2023-12-04 02:57:07 26 4
gpt4 key购买 nike

这实际上是两个相关的问题。

  • 绑定(bind)函数的 flet 和 let 有什么区别。
  • 下面的示例 A 和 B 是否等效?

  • 一种)
    (flet ((myfun (x) (+ x 3)))
    (myfun 3))

    二)
    (let ((myfun (lambda (x) (+ x 3))))
    (funcall myfun 3))

    注意:
    (let ((myfun (lambda (x) (+ x 3))))
    (myfun 3))

    将抛出错误“myfun”未定义运算符。

    最佳答案

    让我们从你的第二个问题开始:

    1. Are the examples A and B below equivalent?


    正如@sds 的答案所详细讨论的那样,两者在语义上是等效的,即使 A 被大多数 Common Lisp 编译器更有效地编译(这很容易理解,因为 B 需要额外调用高级函数 funcall )。

    现在,对于您的第一个问题:

    1. What is the difference between flet and let for binding functions.


    一个区别是,由于 Common Lisp 是一种 Lisp-2 语言(例如,参见 question ),示例 A 绑定(bind)了函数的名称 myfun到一个功能对象,而第二个将一个普通的词法变量绑定(bind)到同一个功能对象。

    结果是,从实际的角度来看,效率的一部分,在语法(调用功能对象的更方便的方式,如您的示例所示)和语义(例如,函数定义一个命名 block ,因此可以编写如下内容: (flet ((myfun (x) (when (< x 0) (return-from myfun 0)) (+ x 3))) (myfun -4)) ,而 let 则不可能)。

    但也许最重要的一点是 flet只是双胞胎特殊运营商的一部分 flet , labels定义局部函数(与 macrolet 一起定义局部宏,参见 specification )。和 labels运算符,您可以定义递归局部函数,这是 let 无法实现的。

    关于common-lisp - flet 与 let+funcall 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34752215/

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