当特殊形式 cond 缺少关键字 else 时,过程是否会被视为谓词 <p> ?

MMM*_*VII 1 lisp scheme racket

我不小心忘记else在下面的cond表达式中输入 ,发生了一些奇怪的事情。

(define (abs x)
  (cond ((< x 0) x)
        ((= x 0) 0)
        (+ 1 2 1001)
        ))

> (abs 1)
1001
> 
Run Code Online (Sandbox Code Playgroud)

的结果(abs 1)不是(+ 1 2 1001)?的结果,即 1004,而是表达式参数的最后一个元素(+ 1 2 1001)

cond形式是

(cond (<p1>,<e1>)
      (<p2>,<e2>)
      (<p3>,<e3>)
      ...
      (<pn>,<en>))
Run Code Online (Sandbox Code Playgroud)

表达式中没有谓词(+ 1 2 1001),所以我想知道该过程+是否被视为谓词,并且它是否总是评估为真,选择最后一个元素返回。是这样操作的???

Ath*_*kla 5

排序beginRacket 中的表单允许您对多个表达式进行排序。它从左到右计算每个表达式,最终结果是最后一个表达式。

语法:for 的语法cond表明,多个表达式可以在没有begin. 这种事情称为隐式开始

语义:根据文档,cond如果 lhs 不是#f. 因此+,在 test-expression 的位置评估子句的 rhs。

风格:按照惯例,在几个关键位置使用方括号使 Racket 代码更具可读性。cond的子句是这些地方之一。

以下代码段等效于您的代码段:

#lang racket

(define (abs x)
  (cond [(< x 0) x]
        [(= x 0) 0]
        [+ (begin 1
                  2
                  1001)]))
(abs 1) 
; => 1001
Run Code Online (Sandbox Code Playgroud)