在 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")
等等。
我不知道怎么问这个问题。基本上,我的教授解决了一个他没有在 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")
等等。