在球拍中使用"cond"和"and"功能



我很难理解 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吗?

首先,condand不是函数,它们是"特殊形式"(作为宏实现(。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)))

最新更新