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),所以我想知道该过程+是否被视为谓词,并且它是否总是评估为真,选择最后一个元素返回。是这样操作的???
排序: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)