scheme - 在 cond 中省略括号会导致奇怪的结果
问题描述
考虑以下代码段
(define (f a b c)
(
cond ((and (< b c) (< b a)) (+ c a))
((and (< a c) (< a b)) (+ c b))
((and (< c b) (< c a)) (+ b a))
)
)
(display (f 2 1 3)) ; 5
(newline)
(display (f 2 8 3)) ; 11
(newline)
(display (f 2 8 -3)) ; 10
现在,如果我从底部评论第二行和第二行
(define (f a b c)
;(
cond ((and (< b c) (< b a)) (+ c a))
((and (< a c) (< a b)) (+ c b))
((and (< c b) (< c a)) (+ b a))
;)
)
结果是
#<undef>
11
10
我无法解释为什么省略括号会导致该结果。在第二种情况下,我预计编译器会将cond ((and (< b c) (< b a)) (+ c a))
,((and (< a c) (< a b)) (+ c b))
和((and (< a c) (< a b)) (+ c b))
作为三个表达式处理,后两个无效,相反,它们似乎被执行了。
解决方案
通常cond
,关键字在解释时应该引发异常。
但是,如果您的解释器没有抛出任何错误,那么您是在块语句的情况下,其中最后一个表达式的评估提供了结果,其他的仅计算副作用。代码简化为:
(define (f a b c) ((and (< c b) (< c a)) (+ b a))))
推荐阅读
- python-3.x - 关于 Collatz Function 的一个简单问题,为什么这是一个无法访问的代码?
- c# - 即使在asp.net中选择最少的记录,Gridvew也会多次循环
- php - Typo3 tx_news 扩展自定义字段 - 内容有时会消失,缓存问题?
- c# - 如何使用 Epplus 获取 excel 中使用的行范围的准确计数?
- javascript - 如何从javascript调用函数到html
- php - PHP 检查它是否是一个有效的 HTML 属性
- react-native - 如何修复此错误 "combineReducers" 是只读的。在 react-native/react-redux 中
- jquery - 如何在 JQuery FancyTree 中部分选择节点?
- android - APK 文件可在 android 模拟器中运行,但无法安装在我的设备上
- scala - 确保扇入元素属于同一个扇出元素