残念ながら、表示しているコードは、ローカル定義がどのように機能するかを示すためのものです。(define sorted-lst (sort lst ...))
同じ例では、まったく機能しないものもわかります。
74 ページのすべての部分を含む 75 ページのサンプル コード全体を次に示します。
(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
例えば。(winners ...)
ラケット インタラクション ウィンドウで使用しようとすると、次のようになります。
勝者: 未定義; 未定義の識別子を参照できません
第5章の楽しみを続けることができることを理解した場合:)
ラケットに同梱されている本の下のコードのすべてのコードがありますracket/collects/realm
。と呼ばれる手続きには 2 つの定義がありますwinners
。の 1chapter 10
番目と の 2 番目chapter 12
。
コードが何をするかに対する答えについては。コードにエラーがあるため、修正する必要があります。私の推測では、score> は 2 つのレコードのスコアを比較します。私はそれが次のようになっていると推測しています:
(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))
最高スコアを持つすべてのもののリストを返します。