在这段代码中
(defun foo ()
. . .
(let ((bar (foo)))
(if bar
. . .)))
Run Code Online (Sandbox Code Playgroud)
在let行,let是唯一有约束力的,对不对?它实际上并没有运行foo.我假设foo在if语句中第一次运行(递归),对吗?如果我认为是正确的,有没有办法let实际执行foo,然后将结果分配给bar?
有一个答案显示了一个说明let行为的例子.但是,通过实现的示例并不能最终回答它是否应该以这种方式运行,或者实现是否可以自由地执行不同的操作,或者实现中是否存在错误.要知道应该发生什么,您需要查看文档.幸运的是,Common Lisp HyperSpec可以在线免费获取.let的文档说:
特别经营者LET,LET*
let和let*创建新的变量绑定并执行一系列使用这些绑定的表单.让我们并行执行绑定,让*按顺序执行.
表格
Run Code Online (Sandbox Code Playgroud)(let ((var1 init-form-1) (var2 init-form-2) ... (varm init-form-m)) declaration1 declaration2 ... declarationp form1 form2 ... formn)首先按顺序计算表达式init-form-1,init-form-2等,保存结果值.然后将所有变量varj绑定到相应的值; 除非有相反的特别声明,否则每种约束都是词汇.然后按顺序评估表达式formk; 除了最后一个之外的所有值都被丢弃(也就是说,let的主体是隐含的预测).
因此,评估(执行)所有表单,然后将结果绑定到值,然后评估正文中的表单.
| 归档时间: |
|
| 查看次数: |
79 次 |
| 最近记录: |