Scheme 添加括号会更改条件的计算

Scheme 添加括号会更改条件的计算,scheme,lisp,Scheme,Lisp,我开始学习Scheme,偶然发现了一件奇怪的事情: 鉴于以下程序: (define (test x y) (if (= x 0) 0 y )) 当我创建一个条件时,当我给它添加括号时,它的计算结果是“如预期的那样”:(测试0 1)给出0。但是,当我不添加括号(并且使用相同的输入)时,它的计算结果为false条件:test01给出1 为什么会这样?如果你写: test 0 1 这与: (begin test ; evaluate variable test => #<proce

我开始学习Scheme,偶然发现了一件奇怪的事情: 鉴于以下程序:

(define (test x y) (if (= x 0) 0 y ))
当我创建一个条件时,当我给它添加括号时,它的计算结果是“如预期的那样”:
(测试0 1)
给出0。但是,当我不添加括号(并且使用相同的输入)时,它的计算结果为false条件:
test01
给出1

为什么会这样?

如果你写:

test 0 1
这与:

(begin
  test ; evaluate variable test => #<procedure:something...> or similar value
  0    ; evaluate literal 0 => 0
  1)   ; evaluate literal 1 => 1
==> 1  ; because 1 is the last expression in the block it is the result of it. 
在JavaScript中也是如此:

const test=(x,y)=>x==0?0:y;
试验;0;1.
==>1//节点中的结果是1,因为它是最后一个表达式
测试(0,1);//使用参数0和1调用变量测试后面的函数
==> 0

因此,括号在JavaScript中的作用与其他内容一样重要。方案中的
(一二三)
基本上是JS中的
一二三)
。在something后面加括号就是在JS中的东西后面加上
()

这就是Scheme语法。您必须使用括号来进行函数调用。我明白了,但Scheme中是什么导致它的计算结果为false的呢?为什么它不给出一个词法错误呢?它不是在求值为false。您看到的是您键入的内容,即
1
。您根本没有调用函数。没错。这是一个读取-评估打印循环。它读取您的输入,对其求值,然后打印结果。数字只是自我评估。谢谢,谢谢!我想要一个解释为什么,而不仅仅是如何,这就是我一直在寻找的。
(if (= 0 0) ; if 0 is the same numeric value as 0
    0       ; then evaluate 0
    1)      ; else evaluate 1
==> 0