【SICP练习】145 练习4.1

本文详细解析了Lisp语言中list-of-values函数的求值顺序依赖于底层的cons函数参数顺序的问题,并提供了解决方案,即实现两个版本的list-of-values函数,分别用于从左到右和从右到左求值。同时,介绍了如何通过no-operands?判断参数列表,并使用let进行局部变量的定义与求值。
版权声明:转载请联系本人,感谢配合!本站地址:http://blog.youkuaiyun.com/nomasp https://blog.youkuaiyun.com/NoMasp/article/details/44728049

练习4-1

原文

Exercise 4.1. Notice that we cannot tell whether the metacircular evaluator evaluates operands from left to right or from right to left. Its evaluation order is inherited from the underlying Lisp: If the arguments to cons in list-of-values are evaluated from left to right, then list-of-values will evaluate operands from left to right; and if the arguments to cons are evaluated from right to left, then list-ofvalues will evaluate operands from right to left.Write a version of list-of-values that evaluates operands from left to right regardless of the order of evaluation in the underlying Lisp. Also write a version of list-of-values that evaluates operands from right to left.

分析

如题中所说的,list-of-values的求值顺序由cons的参数而定。同时也要使用no-operands?来判断exps,如果为真则返回空。而左右之分,在let中的求值顺序可以决定。如果是从左到右就应该是先求值first而后求值rest,最后用cons来构造到一起即可。

代码

 (define (list-of-values-l-to-r exps env) 
   (if (no-operands? exps) 
       '() 
       (let ((first (eval (first-operand exps) env))) 
         (let ((rest (list-of-values-l-to-r (rest-operands exps) env))) 
           (cons first rest))))) 

 (define (list-of-values-r-to-l exps env) 
   (if (no-operands? exps) 
       '() 
       (let ((rest (list-of-values-r-to-l (rest-operands exps) env))) 
         (let ((first (eval (first-operand exps) env))) 
           (cons first rest))))) 



感谢您的访问,希望对您有所帮助。 欢迎大家关注或收藏、评论或点赞。


为使本文得到斧正和提问,转载请注明出处:
http://blog.youkuaiyun.com/nomasp


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值