常见的lisp是绑定,而不是执行?

147*_*7pm 1 common-lisp

在这段代码中

(defun foo ()
   . . .
   (let ((bar (foo)))
      (if bar
         . . .)))
Run Code Online (Sandbox Code Playgroud)

let行,let是唯一有约束力的,对不对?它实际上并没有运行foo.我假设fooif语句中第一次运行(递归),对吗?如果我认为是正确的,有没有办法let实际执行foo,然后将结果分配给bar

Jos*_*lor 5

有一个答案显示了一个说明let行为的例子.但是,通过实现的示例并不能最终回答它是否应该以这种方式运行,或者实现是否可以自由地执行不同的操作,或者实现中是否存在错误.要知道应该发生什么,您需要查看文档.幸运的是,Common Lisp HyperSpec可以在线免费获取.let的文档说:

特别经营者LET,LET*

let和let*创建新的变量绑定并执行一系列使用这些绑定的表单.让我们并行执行绑定,让*按顺序执行.

表格

 (let ((var1 init-form-1)
       (var2 init-form-2)
       ...
       (varm init-form-m))
   declaration1
   declaration2
   ...
   declarationp
   form1
   form2
   ...
   formn)
Run Code Online (Sandbox Code Playgroud)

首先按顺序计算表达式init-form-1,init-form-2等,保存结果值.然后将所有变量varj绑定到相应的值; 除非有相反的特别声明,否则每种约束都是词汇.然后按顺序评估表达式formk; 除了最后一个之外的所有值都被丢弃(也就是说,let的主体是隐含的预测).

因此,评估(执行)所有表单,然后将结果绑定到值,然后评估正文中的表单.