Scheme 当特殊形式cond缺少关键字else时,过程会被视为谓词吗?

Scheme 当特殊形式cond缺少关键字else时,过程会被视为谓词吗?,scheme,lisp,racket,Scheme,Lisp,Racket,我不小心忘了把else放在下面的cond表达式中,发生了一些奇怪的事情 (define (abs x) (cond ((< x 0) x) ((= x 0) 0) (+ 1 2 1001) )) > (abs 1) 1001 > 表达式+1 2 1001中没有谓词,因此我想知道过程+是否被视为谓词,以及它是否总是计算为true,并选择要返回的最后一个元素。这就是它的工作原理吗?的工作原理如下: (cond (test-e

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

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

> (abs 1)
1001
> 
表达式+1 2 1001中没有谓词,因此我想知道过程+是否被视为谓词,以及它是否总是计算为true,并选择要返回的最后一个元素。这就是它的工作原理吗?

的工作原理如下:

(cond (test-expr then-body) 
      (test-expr2 then-body2)
      (else then-body3))
测试表达式一个接一个地进行测试,第一个返回非false值的测试表达式将执行其相应的then体。然后执行的主体中的最后一个值是整个cond的值

在Scheme中,任何不是f的东西都被认为是真的。因此,+被认为是正确的。在你的情况下,+就像一个else,因为它总是正确的。事实上,您的代码可以这样编写,而不会改变任何行为:

(define (abs x)
  (cond ((< x 0) x)
        ((= x 0) 0)
        (else 1 2 1001)))
在原始代码中,返回非false值的第一个测试表达式是+。因为1001是执行的then体的最后一个值,所以1001是整个cond的值。这就是为什么您得到了1001。

的工作原理如下:

(cond (test-expr then-body) 
      (test-expr2 then-body2)
      (else then-body3))
测试表达式一个接一个地进行测试,第一个返回非false值的测试表达式将执行其相应的then体。然后执行的主体中的最后一个值是整个cond的值

在Scheme中,任何不是f的东西都被认为是真的。因此,+被认为是正确的。在你的情况下,+就像一个else,因为它总是正确的。事实上,您的代码可以这样编写,而不会改变任何行为:

(define (abs x)
  (cond ((< x 0) x)
        ((= x 0) 0)
        (else 1 2 1001)))
在原始代码中,返回非false值的第一个测试表达式是+。因为1001是执行的then体的最后一个值,所以1001是整个cond的值。这就是为什么您得到了1001。

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

语法:的语法表明可以在子句的rhs中对多个表达式进行排序,而无需begin。这样的事情叫做隐式开始

语义:根据文档,如果lhs不是f,cond会计算子句的rhs。因此,+在测试表达式的位置计算子句的rhs

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

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

#lang racket

(define (abs x)
  (cond [(< x 0) x]
        [(= x 0) 0]
        [+ (begin 1
                  2
                  1001)]))
(abs 1) 
; => 1001
排序:Racket中的表单允许您对多个表达式进行排序。它从左到右计算每个表达式,最终结果是最后一个表达式

语法:的语法表明可以在子句的rhs中对多个表达式进行排序,而无需begin。这样的事情叫做隐式开始

语义:根据文档,如果lhs不是f,cond会计算子句的rhs。因此,+在测试表达式的位置计算子句的rhs

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

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

#lang racket

(define (abs x)
  (cond [(< x 0) x]
        [(= x 0) 0]
        [+ (begin 1
                  2
                  1001)]))
(abs 1) 
; => 1001
cond是在lisp中执行if elseif*-else的一种方法,与if嵌套相比,它可以获得更平坦的结构。因为cond是派生形式,所以可以根据if编写条件语句。您的程序将变成:

(define (abs x)
  (if (< x 0) 
      x
      (if (= x 0) 
          0
          (if +
              (begin
                1 
                2 
                1001)))))
这里它没有成瘾的后果,谓词的真实结果是abs 1的结果。人们希望代码尽可能清晰,因此在此处使用else是一个更好的选择:

(define (abs x)
  (cond ((< x 0) x)
        ((= x 0) 0)
        (else (+ 1 2 1001))))
如果对其他进程的调用是真的,那么结果就是真的,如果是f,那么您将得到实现者选择的结果。这些几乎都是真实的价值观,有着疯狂的可视化效果,比如香蕉,甚至f。因此,明智的做法是使用else术语,这样您就可以选择结果,而不是其他开发人员:cond是在lisp中使用if-elseif*-else的一种方法,它可以获得比if嵌套更平坦的结构。因为cond是派生形式,所以可以根据if编写条件语句。您的程序将变成:

(define (abs x)
  (if (< x 0) 
      x
      (if (= x 0) 
          0
          (if +
              (begin
                1 
                2 
                1001)))))
这里它没有成瘾的后果,谓词的真实结果是abs 1的结果。人们希望代码尽可能清晰,因此在此处使用else是一个更好的选择:

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

如果对其他进程的调用是真的,那么结果就是真的,如果是f,那么您将得到实现者选择的结果。这些几乎都是真实的价值观,有着疯狂的可视化效果,比如香蕉,甚至f。因此,明智的做法是使用一个else术语,以便您而不是其他开发人员选择结果:-

也许您会对cond感兴趣。rktit在cond子句中不是谓词,而是布尔值。通过调用谓词可以得到布尔值,或者它可能已经存在
,如