5

私は今、とても好きな本「Realm Of Racket」を読んでいます。ただし、74 ページの第 4 1/2 章には、私が理解できないコード例が 1 つあります。私は休暇中なので、私の心はそれを理解することを拒否しているのかもしれませんが、私は単にそれが何をするのか理解していません.

(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)))]))

彼らは本でそれを本当に説明していません。ただし、いくつかのヒントが得られます。

  • 「関数の目的は、ゲーム記録のリストから 1 位のフィニッシャーを選ぶことです。」
  • "次の形状の構造体定義があります: (struct record (name score)) "
  • lstはそのようなレコードのリストであり、predはそのようなレコードの 1 つです。実際、元のリストは(cons pred lst)であり、スコアに従ってソートされます。」
  • 「勝者はリストを食べる関数であり、一度に 1 つのレコードを通過することを理解しています。他のレコードが少なくとも 1 つある場合、最初のレコードを選択し、 fst という名前を付けfstとその前のレコードのスコアを比較します。その結果、すべての勝利記録が除外されるか、勝者は同点のプレーヤーを探し続ける必要があります。」

score>それはタイプミスだと思います。それに加えて、構文とセマンティクスの観点から、コードを完全に理解しています。私はそれを実際に使用することはできません。これは何ですか、なぜ誰かがそれを望むのでしょうか?

4

2 に答える 2

5

残念ながら、表示しているコードは、ローカル定義がどのように機能するかを示すためのものです。(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-listwinnerswinning-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))

最高スコアを持つすべてのもののリストを返します。

于 2013-07-21T21:34:36.997 に答える