0

私はそれが(スキームで)何をするのかを正確に理解しようとしていますが、あまり意味がありません。誰かがそれを簡単な言葉で説明しようとすることはできますか? それは大歓迎です!

問題となっている問題

数十億ドル単位の GDP、数百万平方マイル単位の面積、および数百万単位の人口を使用して国を表します。次のメッセージに応答するオブジェクトを返すメッセージ パッシング プロシージャ (make-country-mp gdp areapopulation) を記述します。

• 'gdp; 単純に gdp を返す

• '範囲 ; 単に領域を返す

• '人口 ; 単純に母集団を返す

•'ポップ密度; 帰還人口を面積で割った値

• 'gdp-per-capita; gdp を人口で割った値を返します

• '大きいです。別の国のメッセージ パッシング オブジェクトを受け取るプロシージャを返し、最初の郡 (元の郡) の面積が 2 番目の国 (渡される郡) の面積よりも大きい場合は true、そうでない場合は false を返すスキームのブール値を返します。

補足:問題の大部分に対して動作するコードがありますが、それがどのように機能するかについての説明が欲しいだけです。私がしなければならなかったのは、メッセージパッシングが機能する方法の一般的な形式に従うことだけでしたが、私はそれをまったく理解していません. ここにあります

(define (make-country-mp gdp area population)
    (define (dispatch msg)
      (cond ((equal? msg 'gdp) gdp)
        ((equal? msg 'area) area)
        ((equal? msg 'population) population)
        ((equal? msg 'pop-density) (/ population area))
        ((equal? msg 'gdp-per-capita) (/ gdp population))
       ;((equal? msg 'is-bigger) ; unsure of the code here
        (else (error "invalid option" msg)))) 
     dispatch)
4

1 に答える 1

2

基本的に、1 つの引数で呼び出すことができる関数オブジェクト (この場合は、呼び出しに渡された、、およびmake-country-mpの値を記憶するクロージャ) を返します。引数は、記号、、、、、および と照合され、それぞれの場合に適切な結果が返されます。gdpareapopulationmake-country-mpgdpareapopulationpop-densitygdp-per-capitais-bigger

を知っていればcase、読みやすいかもしれません。

(define (make-country-mp gdp area population)
  (lambda (msg)
    (case msg
      ((gdp) gdp)
      ((area) area)
      ((population) population)
      ((pop-density) (/ population area))
      ((gdp-per-capita) (/ gdp population))
      ((is-bigger) (lambda (rhs)
                     (> area (rhs 'area))))
      (else (error "invalid option" msg)))))
于 2013-11-12T08:07:49.970 に答える