在 Scheme 中不使用布尔运算符的多个条件

Multiple conditions without using boolean operators in Scheme

我不知道怎么问这个问题。基本上,我的教授解决了一个他没有在 cond 语句中使用布尔表达式(and、or、not)的问题。所以,我试着想出一个虚拟的例子,但我注意到了一些奇怪的事情。正如您在下面看到的。我不知道为什么 true false 给我 false 而不是去 else 语句,但是当我做 false true 时,它​​会转到 else 语句。我将其视为 AND 运算符,我知道我错了。

(cond ((= 2 2) (= 3 3))
      (else "Hello"))   ; --> T T --> #t

(cond ((= 2 2) (= 3 1))
      (else "Hello"))   ; --> T F --> #f

(cond ((= 2 1) (= 3 3))
      (else "Hello"))   ; --> F T --> "Hello"

(cond ((= 2 1) (= 3 1))
      (else "Hello"))   ; --> F F --> "Hello"

你应该知道三个等式。

1.

(cond
  [#t <A>]
  .........)

计算为 <A>

2.

(cond
  [#f <A>]
  .........)

评估为

(cond
  .........)

也就是说,当一个子句的 LHS 为 #f 时,只需“划掉”该子句。

3.

(cond
  [else <A>])

计算为 <A>

在你的例子中:

1.

(cond ((= 2 2) (= 3 3))
      (else "Hello"))

=

(cond (#t (= 3 3))
      (else "Hello"))

通过使用第一个等式,我们得到结果应该是 (= 3 3) = #t.

2.

(cond ((= 2 2) (= 3 1))
      (else "Hello"))

=

(cond (#t (= 3 1))
      (else "Hello"))

通过使用第一个等式,我们得到结果应该是 (= 3 1) = #f.

3.

(cond ((= 2 1) (= 3 3))
      (else "Hello"))

=

(cond (#f (= 3 3))
      (else "Hello"))

通过使用第二个等式,我们得出它的计算结果应为:

(cond (else "Hello"))

通过使用第三个等式,我们得到它的计算结果应该是 "Hello"

4.

(cond ((= 2 1) (= 3 1))
      (else "Hello"))

=

(cond (#f (= 3 1))
      (else "Hello"))

通过使用第二个等式,我们得出它的计算结果应为:

(cond (else "Hello"))

通过使用第三个等式,我们得到它的计算结果应该是 "Hello"

cond语法是

(cond (condition1 value1)
      (condition2 value2)
      ...
      (conditionN valueN))

所以您的条件是 (= 2 2)(= 2 1)else(相当于 cond 表达式中的 #t),并且可能的值为 (= 3 3)(= 3 1) 和 `"Hello".

(cond (condition value1) 
      (else value2))

等同于

(if condition value1 value2)

所以你有相当于

(if (= 2 2)
    (= 3 3)
    "Hello")

(if (= 2 2)
    (= 3 1)
    "Hello")

等等。