【问题标题】:Totally confused by racket syntax - please lend a hand完全被球拍语法弄糊涂了-请帮忙
【发布时间】:2020-02-28 05:23:33
【问题描述】:

我被要求为大学学习一些球拍,最终将不得不用树结构和数据集做一些非常复杂的事情。我刚刚开始,即使使用 Racket 文档、google 和 SO,我也无法理解这段代码是如何工作的。

我正在尝试编写一个接受三个数字参数并返回最大参数的函数,这就是我所拥有的:

(define (mymax x1 x2 x3)
    (cond
        ((and (x1 > x2) (x1 > x3)) x1)
        (else (and (x2 > x1) (x2 > x3)) x2)
        (else (and (x3 > x1) (x3 > x2)) x3)
))
(print (mymax 10 5 1))

所以...

  • 我不知道我是否正确使用了 and 比较
  • 我收到错误“cond: bad syntax (`else' clause must be last) in: (else (and (x2 > x1) (x2 > x3)) x2)”
  • 我真的不知道如何从函数返回值

很抱歉这么无知,但这只是没有意义,任何帮助阐明这些要点将是一个巨大的帮助

【问题讨论】:

  • 只有最后一个词可能有关键字else,而不是总是计算为真的表达式。您可以将其视为#t amd 的同义词,因为每种情况都为真,cond 在它之后没有更多子句,因为它们仅在所有先前都为假时才被评估。例如,你可以写if(true),而不是c 语言中的`else`。 elseif 后面还有用吗?
  • condelse 子句类似于其他语言中switch 语句的default 情况。只需删除第二种情况下的 else 关键字即可。
  • 谢谢大家仍然困惑。我删除了第二种情况的else,运行并得到错误“应用程序:不是过程;期望一个可以应用于给定参数的过程:10个参数......:”

标签: function functional-programming boolean racket


【解决方案1】:

这是条件表达式的语法:

(cond
  [ConditionExpression1 ResultExpression1]
  [ConditionExpression2 ResultExpression2]
  ... 
  [ConditionExpressionN ResultExpressionN])


(cond
  [ConditionExpression1 ResultExpression1]
  [ConditionExpression2 ResultExpression2]
  ...
  [else DefaultResultExpression])

条件表达式的求值遵循 2 条规则

1) 规则 cond_false

(cond                    == (cond
  [#false ...]               ; first line removed
  [condition2 answer2]       [condition2 answer2]
  ...)                       ...)

2) 规则 cond_true

(cond                    == answer-1
  [#true answer-1]
  [condition2 answer2]
  ...)

第二条规则也适用于条件为 else 时(但请注意 else 只能出现在最后一个子句中)。


示例

(cond
  [(= 2 0) #false]
  [(> 2 1) (string=? "a" "a")]
  [else (= (/  1 2) 9)])

== {通过评估 (= 2 0)#false}

(cond
  [#false #false]
  [(> 2 1) (string=? "a" "a")]
  [else (= (/  1 2) 9)])

== {按规则cond_false}

(cond
  [(> 2 1) (string=? "a" "a")]
  [else (= (/  1 2) 9)])

== {通过评估 (> 2 1)#true}

(cond
  [#true (string=? "a" "a")]
  [else (= (/  1 2) 9)])

== {按规则cond_true}

(string=? "a" "a")

== {通过评估 (string=? "a" "a")true}

#true

(define (mymax x1 x2 x3)
    (cond
        ((and (x1 > x2) (x1 > x3)) x1)
        (else (and (x2 > x1) (x2 > x3)) x2)
        (else (and (x3 > x1) (x3 > x2)) x3)
))
(print (mymax 10 5 1))
  • (2 > 1) 这样的表达式将不起作用。应该是(> 2 1)function application 的语法是前缀语法,即左括号后面应该是函数名,函数名后面应该是参数。

  • 您得到的错误是第二个子句的语法错误。 (else (and (x2 > x1) (x2 > x3)) x2) 该子句有 3 个部分:else(and (x2 > x1) (x2 > x3))x2。但是按照cond的语法,一个子句应该只有2个。

去掉elses 并添加> 前缀后:

(define (mymax x1 x2 x3)
  (cond
    ((and (>  x1 x2) (> x1 x3)) x1)
    ((and (> x2 x1) (> x2 x3)) x2)
    ((and (>  x3 x1) (> x3 x2)) x3)))

(print (mymax 10 5 1))

程序打印10。但请注意,它不适用于(mymax 5 5 5),因此我们将所有>s 转为>=s:

(define (mymax x1 x2 x3)
  (cond
    [(and (>= x1 x2) (>= x1 x3)) x1]
    [(and (>= x2 x1) (>= x2 x3)) x2]
    [(and (>=  x3 x1) (>= x3 x2)) x3]))

(mymax 10 5 1)
; => 10
(mymax 5 5 5)
; => 5

最后,函数不会“返回”值。一个更好的心智模型是认为他们的身体减少到一个价值。

(define (f x-1 ... x-n)
  f-body)

(f v-1 ... v-n) 
; == f-body
; with all occurrences of x-1 ... x-n 
; replaced with v-1 ... v-n, respectively

请参阅:Racket GuideThe Racket ReferenceHtDP

【讨论】:

  • 非常感谢您花时间解释这一点。这是我第一次看到这样的编程语言,它与我使用的其他语言完全不同。干杯:)
猜你喜欢
  • 2014-07-30
  • 2022-01-23
  • 2019-01-12
  • 1970-01-01
  • 2014-08-14
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 2012-05-20
相关资源
最近更新 更多