Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme 为什么可以';我定义了一个;或功能“;计划中?_Scheme - Fatal编程技术网

Scheme 为什么可以';我定义了一个;或功能“;计划中?

Scheme 为什么可以';我定义了一个;或功能“;计划中?,scheme,Scheme,我在方案中发现了关于特殊功能“或”的问题: Joe Hacker大声表示,没有理由或在Scheme中需要特殊——它可以由程序员定义,如下所示: (define (or x y) (if x #t y)) 乔说得对吗 我不明白为什么不可能这样做 一些方案专家能解释一下这是否有效吗?如果不行,为什么不行?这是因为此版本的或会评估其所有参数(因为它是一个函数),而标准方案或(不是函数,而是特殊语法)不会。尝试在Scheme REPL上运行(或#t(exit))

我在方案中发现了关于特殊功能“或”的问题:

Joe Hacker大声表示,没有理由或在Scheme中需要特殊——它可以由程序员定义,如下所示:

(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的
函数是这样工作的吗?顺便说一句,它可以由程序员定义,但不能作为一个简单的函数。对于某些特殊的价值观来说,这并不特别。就这样!谢谢你的解释,这很有帮助!