Liutos / LiutCL

主动挖坑并打算努力填坑的一个简陋的Lisp解释器
33 stars 4 forks source link

需要为函数的名和体之间的绑定新建一个环境 #7

Open Liutos opened 12 years ago

Liutos commented 12 years ago

symbol-value和symbol-function属于依附于一个符号的内容,它们不是环境的一部分,而是符号的一部分。如果要实现完整的Common Lisp,那么动态作用域是必不可少的,因此let可能就无法简单地实现为lambda的语法糖了。

flet可以局部重定义一个在全局定义的同名函数,可是它所改变的不是一个符号对应的symbol-function成员,而是#',即特殊操作符function所得到的结果。因此,function应该是一种在函数环境中查找一个符号对应的函数体的方式,而一般的变量则是由另外的机制进行查找,但它们有两个环境——一个对应lexical scope,一个对应dynamic scope。

Lisp-1与Lisp-2的区别,和词法作用域与动态作用域的区别,是完完全全的两回事。