我很难理解 Racket 中的and
+cond
函数。为什么以下两个功能彼此不同?
功能一:
(define (test? function)
(and (list? function) (>= (length function) 1)))
函数b:
(define (test?function )
(cond [(and (list? function))
(>= (length function) 1) ]))
在我的理解中,这基本上意味着,
(if (list? function)
返回 true;(if (>= (length function) 1)
返回 true;
这与函数A几乎相同。我的理解是错误的吗?
我不明白它们之间有什么不同。请解释一下。不能用cond
/if
写函数a吗?
首先,cond
和and
不是函数,它们是"特殊形式"(作为宏实现(。cond
表达式的语法与函数调用的语法不同。and
表达式的语法与函数调用的语法相同,但and
不一定计算其所有参数。
以下是使用cond
重写test?
函数的一种方法。(我还将参数从function
重命名为x
,因为它似乎不像函数。
(define (test? x)
(cond [(and (list? x) (>= (length x) 1))
#t]
[else
#f]))
通常,只要您有一个布尔表达式expr
就可以将其替换为(cond [expr #t] [else #f])
或(if expr #t #f)
。但这样做通常没有意义。
这是编写函数的另一种方法:(and condition1 condition2)
的意思与(cond [condition1 condition2] [else #f])
相同,因此您可以像这样编写函数:
(define (test? x)
(cond [(list? x)
(>= (length x) 1)]
[else
#f]))
不过,一般来说,该函数的原始版本被认为是最好的:
(define (test? x) (and (list? x) (>= (length x) 1)))