gpt4 book ai didi

lisp - 来自 "Realm of Racket"的奇怪代码示例

转载 作者:太空宇宙 更新时间:2023-11-03 18:37:54 25 4
gpt4 key购买 nike

我目前正在阅读《Realm Of Racket》一书,到目前为止我非常喜欢这本书。但是,在第 4 1/2 章的第 74 页上,有一个代码示例我就是不明白。也许是因为我正在度假,所以我的头脑拒绝弄清楚它,但是,我根本不明白它在做什么。

(define (winners lst pred)
(cond
[(empty? lst) (list pred)]
[else
(define fst (first lst))
(if (score> (record-score pred) (record-score fst))
(list pred)
(cons pred (winners (rest lst) fst)))]))

他们并没有在书中真正解释它。不过,他们给出了一些提示:

  • “该函数的目的是从游戏记录列表中选出第一名。”
  • “我们有以下形状的结构定义:(struct record (name score))
  • lst 是此类记录的列表,pred 是其中一个记录。确实,原列表为(cons pred lst),按分数排序。"
  • “你知道 winners 是一个吃列表的函数,一次检查一个记录。当至少有一个其他记录时,它会选择第一个,并将其命名为 fst,然后比较 fst 和它的前辈的分数。根据结果,所有获胜记录都被剔除,或者获胜者必须继续寻找得分相等的玩家。”

我想 score> 是一个拼写错误。除此之外,我完全理解代码——在语法和语义方面。我只是不明白它的实际用途。这是什么,为什么会有人想要那个?

最佳答案

不幸的是,您显示的代码只是为了向您展示本地定义的工作原理。在同一示例中,您还会看到 (define sorted-lst (sort lst ...)) 根本不起作用。

这是第 75 页的完整示例代码,其中包含第 74 页的所有部分:

(define (winning-players lst)
(define sorted-lst (sort lst ...)) ;; local variable
(define (winners lst pred) ;; locally defined procedure
(cond
[(empty? lst) (list pred)]
[else
(define fst (first lst))
(if (score> (record-score pred) (record-score fst))
(list pred)
(cons pred (winners (rest lst) fst)))]))
;; START HERE:
;; uses both local variable and the locally defined procedure
(winners (rest sorted-lst) (first sorted-lst)))

他们试图在以下代码中展示的是,winning-players 之外,您无法访问 sorted-list 也无法使用过程 winners 因为它隐藏在 winning-players 的范围内。

例如。如果你尝试在 Racket 交互窗口中使用 (winners ...) 你会得到:

winners: undefined; cannot reference undefined identifier

如果你明白了你可以继续第 5 章的乐趣:)

与 racket 捆绑在一起,您可以在 racket/collects/realm 下获得本书代码中的所有代码。有 2 个名为 winners 的过程定义。第一个在第 10 章,第二个在第 12 章

至于代码做什么的答案。代码中有错误,因此我们需要修复它。我的猜测是 score> 比较两条记录的分数。我猜它应该是这样的:

(struct record (name score) #:transparent)
(define (winning-players lst)
(define (score> e1 e2) ; defines a new local procedure
(> (record-score e1) ; that compares two records
(record-score e2)))

;; define sorted-list to be lst sorted by score in decreasing order
(define sorted-lst (sort lst score>))
;; procedure winners reduces the list to the elements
;; that have same score as pred
(define (winners lst pred)
(cond
[(empty? lst) (list pred)]
[else
(define fst (first lst))
(if (score> pred fst) ;; changed to work with records
(list pred)
(cons pred (winners (rest lst) fst)))]))
;; START HERE:
;; uses both local variable and the locally defined procedure
(winners (rest sorted-lst) (first sorted-lst)))

(define scores (list (record "John" 10)
(record "Ben" 5)
(record "Mary" 10)
(record "Owen" 2)))

(winning-players scores)
; ==> (list (record "John" 10) (record "Mary" 10))

它返回所有得分最高的列表。

关于lisp - 来自 "Realm of Racket"的奇怪代码示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17772561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com