早期的LISP第II部分

2021-04-05 23:59:40

到1959年4月,使用子实现β-减少的问题变得显而易见。在1959年4月的电子设备研究实验室的季度进展报告中,MCCarthy提供了适用的通用S函数的更新定义:应用[F; F; args] = eval [f ctoup [f; appq [arps]]; nil]其中appq [m] = [null [m]→nil; t→缺点[list [quote; car [m]]; appq [cdr [m]] ]]和求解[e; a] = [原子[e]→eval [Ascap [e; a]; a]; Atom [Car [E]]→[Car [E] = Quote→CADR [E];汽车[e] =原子→Atom [eval [CADR [E]; a]];轿车[e] = eq→[eval [CADR [E]; a] = eval [caddr [e]; a]];汽车[ e] = Cond→Evcon [CDR [e]; a];轿车[e] =轿车→汽车[eval [CADR [E]; a]]; car [e] = cdr→cdr [eval [CADR [CADR [CADR [CADR [CADR [CADR [E] ; a]];轿车[e] =缺点→涉及[eval [CADR [E]; a]; eval [Caddr [e]; a]]; t→eval [cons [Acap [Car [e]; a] ; aevlis [cdr [e]; a]]; a]; caar [e] = label→eval [caddar [e]; cdr [e]];缺点[列表[cadar [e];汽车[e ]; a]]; caar [e] = lambda→eval [caddar [e];附录[对[cadar [cadar [e]; cdr [e]]; a]和evcon [c; a] = [eval [ CAAR [C]; A]→eval [CADAR [C]; A]; T→EVCON [CDR [C]; A]和EVLIS [M; A] = [NULL [M]→NIL; T→缺点[列表[报价; eval [车[m]; a]]; evlis [cdr [m]; a]]

我发现我们更容易了解我们是否将其转录为现代普通的Lisp :;;;嘿emacs,这是 - * - lisp - * - (包装和#34; cl-user");避免滥用标准定义f(APPQ ARGS))NIL))(DEFUN APPQ(M)(COND((null m)零)(t(缺点(缺点' quote(carm))(APPQ(CDR M)))))))) )(Defun Eval(EA)(Cond((Atom E)(eval(Acce ea)a))((原子(汽车e))(cond((eq(eq(equ(e)' quote)(cadr e) )((eq(轿车e)'原子)(原子(eval(CADR e)a)))((eq(e)' eq)(方程式)(eq(eval(CADR e)a)( eval(CADDR e)a))))((eq(care e)' cond)(EVCON(CDR)a))((eq(eq(care)'汽车)(汽车(eval(CADR e)a)))((eq(eq(care)' cdr)(cdr(eval(CADR e)a))))((eq(care e)' cons)(缺点(eval(CADR e)a)(求助(CADDR e)a))))(at(emp(涉及(acc(care(acc))(EVLIS(CDR e)))a)))))((eq(caar e)& #39;标签)(申请(CADDAR E)(CDR e))(缺点(名单(CADAR E)(CARE))a))))((eq(caar e)' lambda)(eval (CADDAR E)(附加(对(CADAR E)(CDR E))a)))))))(Defun Evcon(CA)(Cond((eval(Caar C)A)(eval(CADAR C)A))( t(Evcon. (CDR C)a)))))(Defun EVLIS(MA)(COND((NULL M)零)(T(缺点(名单和#39; Quote(eval(CAR M)))(EVLIS(CDR M))一个)))));;;现代助手(Defun Adsoc(KL)(CADR(CL:Assoc)))(Defun对(LS RS)(Map'列表#39; list ls rs))(defun testit()(适用& #39;(标签ff(lambda(x)(cond((atom x)x)((引用t)(ff(car x))))))(列表'((a。b)。c ))))

关于这个有一些事情要注意到这一点。首先,没有代码检查符号的值单元格或功能单元格。通过查找关联列表A中的值来评估所有符号,因此此评估程序使用一个命名空间。其次,评估组合时的递归调用评估(内部条件的最后一个条款和标签和Lambda条款)处于尾部位置,因此该评估员可以递归地编码尾部。 (不检查IBM 704汇编代码是不可能的。)

关于此评估者的最好奇员是外部COND中的第一个条款。这是可变查找发生的地方。正如您所看到的,我们通过调用Assoc来查找变量,但一旦我们获得该值,我们就会调用eval。此Lisp ISN' t存储环境中的值,而是评估为值的表达式。如果我们查看COND的Lambda子句,请致电以lambda表达式开头的组合,我们可以看到它不会评估Lambda的参数,而是将绑定变量与参数&#39相关联。表达。因此,它具有逐个名称语义而不是现代呼叫Quale值语义。

到1960年4月,我们看到了这些变化:( Defun评估(EA)(Cond(Atom E)(Assoc EA))((Atom(Care E))(Cond((eq(轿车e)' quote)( CADR e))((eq(汽车e)' atom)(原子(eval(cadr e)a)))((eq(care e)' eq)(方程式)(eqs(eval(CADR E) a)(eval(CADDR e)a))))((eq(care e)' cond)(EVCON(CDR e)a))((eq(care e)'汽车)(汽车( eval(CADR e)a)))((eq(e)' cdr)(CDR(eval(CADR e))))((eq(eq(care)' cons)(缺点(评估(CADR e)a)(求助(CADDR e)a))))(申请(股份(CARE(CARE)A)(EVLIS(CDR))a))))))((嘉嘉(CAAR e)'标签)(eval(CADDAR E)(CDR e))(缺点(名单(CADAR E)(CARE)(CARE))a)))((eq(caar e)' lambda )(评估(Caddar E)(附加(对(CADAR E)(EVLIS(CDR e)))))))))))

说明如何评估Atom现在SimpleyLook上升到Atom的价值,并评估Lambda组合涉及热切地评估争论。这是一个逐个值解释器。