Scheme 为什么可以';我定义了一个;或功能“;计划中?
我在方案中发现了关于特殊功能“或”的问题: Joe Hacker大声表示,没有理由或在Scheme中需要特殊——它可以由程序员定义,如下所示:Scheme 为什么可以';我定义了一个;或功能“;计划中?,scheme,Scheme,我在方案中发现了关于特殊功能“或”的问题: Joe Hacker大声表示,没有理由或在Scheme中需要特殊——它可以由程序员定义,如下所示: (define (or x y) (if x #t y)) 乔说得对吗 我不明白为什么不可能这样做 一些方案专家能解释一下这是否有效吗?如果不行,为什么不行?这是因为此版本的或会评估其所有参数(因为它是一个函数),而标准方案或(不是函数,而是特殊语法)不会。尝试在Scheme REPL上运行(或#t(exit))
(define (or x y)
(if x
#t
y))
乔说得对吗
我不明白为什么不可能这样做
一些方案专家能解释一下这是否有效吗?如果不行,为什么不行?这是因为此版本的
或会评估其所有参数(因为它是一个函数),而标准方案或
(不是函数,而是特殊语法)不会。尝试在Scheme REPL上运行(或#t(exit))
,然后使用或
功能进行相同的尝试
标准或
的行为有时被调用:它只计算需要的参数。这对于编程语言中的二进制布尔运算符(或
和和
)来说非常常见。事实上,或
看起来像函数调用,这是Scheme/Lisp语法的一个特点,但看起来有欺骗性。它是否有效取决于您希望它做什么。对于两个给定的布尔值,它肯定会返回预期的结果。但是,它在功能上并不等同于常规的或,因为它不会短路,也就是说,给定您的定义(或#t(/0))
将导致错误,因为您在使用常规的或时将0除以0,它只会返回#t
,而不会尝试计算(/0)
一点也不知道。我不知道你们在用什么书来学习Scheme,所以我不得不去。“如果没有s,则返回#f。否则,表达式将从左到右求值,直到a返回真值val(见第5.7节)或者到达最后一个。在前一种情况下,or表达式返回val而不计算其余表达式。在后一种情况下,计算最后一个表达式并返回其值。“Joe的或函数是这样工作的吗?顺便说一句,它可以由程序员定义,但不能作为一个简单的函数。对于某些特殊的价值观来说,这并不特别。就这样!谢谢你的解释,这很有帮助!