Racket中带有 "cond "和 "and "的函数。

问题描述 投票:0回答:1

我很难理解 and + cond Racket中的函数。为什么下面的两个函数会有不同?

功能 a:

(define (test? function)
  (and (list? function) (>= (length function) 1)))

职能: b:

(define (test?function )
 (cond [(and (list? function))
         (>= (length function) 1) ]))

在我的理解中,这基本上意味着:

  • (if (list? function) return true;
  • (if (>= (length function) 1) 返回true。

这和函数 a. 我的理解有误吗?

我不明白它们之间有什么不同。请解释一下。是不是可以写函数 acond if ?

racket
1个回答
4
投票

首先是, condand 不是函数,而是 "特殊形式"(以宏形式实现)。语法中的 cond 表达式的语法与函数调用的语法不同。句法是一个 and 表达式与函数调用的表达式相同,但是 and 不一定能评价所有的论点。

这里有一种重写你的 test? 函数,使用 cond. (我还把参数的名字从原来的 functionx因为它看起来不像一个函数)。)

(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)))
© www.soinside.com 2019 - 2024. All rights reserved.