2016-09-18 12 views

答えて

2

化合物手順は、1つ以上の他の手順からなるものである。これは簡単で簡単な定義ですが、データに同じ理由を適用しようとすると少しトリッキーになります。私は例ハロルドアベルソンは、講義で与え信じる

はの線に沿って何かである:これは、メモリから言い換えている

- ハロルドアベルソン、私はここであなたの正義をやった願っています。 numer1numer2denom1、およびdenom2

たちは数字を取っ+rat手続きを行うことだった想像してみてください。それはのように見えるかもしれません呼び出し:

;; naively add two rational numbers 
(+rat numer1 denom1 numer2 denom2) 

は今、私たちは乗算をサポートするために、この更を拡張したい場合、あなたはこれが本当になっている各有理数のためのより多くの変数

;; add then multiply 
(define rat1 (+rat numer1 denom1 numer2 denom2)) 
(*rat (numer rat1) (denom rat2) numer3 denom3) 

を導入する必要があるとし続けるだろうと想像します本当にすごい。有理数のデータを簡単な数値データのように扱えばどうでしょうか?個々のコンポーネント(numerおよびdenom)を常に考慮する必要がない場合はどうなりますか?有理数をとすると、化合物データとなりますか?

;; add two rational numbers 
(define m (make-rat 3 4)) 
(define n (make-rat 5 6)) 
(+rat m n) 

;; add then multiply 
(define o (make-rat 1 2)) 
(*rat (+rat m n) o) 

ここで、私たちの計算をより良い方法で表現することができます。これを個数加算と比較する

これらの表現は非常に簡単に理解できます。有理数の個々の成分(numerおよびdenom)に関心を持つ必要はなく、化合物データを直接扱うことができます。私たちのプログラムは複雑さを増し続けているので、これは私たちに大きな負担をかけることになります。非ナイーブな実装で

;; naive procedure 
(define (+rat n1 d1 n2 d2) 
    (make-rat (+ (* n1 d2) 
       (* n2 d1)) 
      (* d1 d2))) 

;; compound data procedure 
(define (+rat x y) 
    (make-rat (+ (* (numer x) (denom y)) 
       (* (numer y) (denom x))) 
      (* (denom x) (denom y)))) 

、手順がxymake-ratで構築した値であることを期待 - または非常に少なくとも、彼らは有効なnumerdenomセレクタを持っている必要があります。このように手続きを書くことは、単純な別個の断片ではなく、複合データを渡すことができ、必要に応じて手続きの中で別のデータを選ぶことを意味します。

メモリからの言い換え。ソース:とにかくSICP Lecture 2B: Compound Data

、あなたが質問をすることが正しいです。複合手続きと複合データの構文が類似しているという事実は、がコードとデータの間の線をぼやけていることを意味します。

マインド爆発:コードはデータです。データはコードです。

続きを読むSICP。それは私の人生を変えた。


ボーナスソーダ!

コードとしてのこのアイデアは私にとって非常に興味深いものです。私は他の言語を勉強したときにオブジェクトや配列のようなものに疑問を覚えたことはありません。しかし、私はSICPを勉強して、データを違った考え方で考えたとき、私はconscar、そしてcdr-と答えました。正確にはですか?

最終的には、どうすれば実装されているかは関係ありません。我々がこれらの3つの手続きを心配しているだけなら、彼らは実現した契約について考える必要があります。

- - - - Contract - - - - 

For any x and y 

    (car (cons x y)) is x 

    (cdr (cons x y)) is y 

- - - - - - - - - - - - - 

私は私が今までを見た中で最も美しいものの一つを見ことLambda Calculusを勉強するまで、それはありませんでした。私はScheme&hellipでここに紹介します。

(define (cons x y) 
    (lambda (p) (p x y))) 

(define (car p) 
    (p (lambda (x y) x))) 

(define (cdr p) 
    (p (lambda (x y) y))) 

(println (car (cons 'x 'y))) ;; => 'x 
(println (cdr (cons 'x 'y))) ;; => 'y 

何が! 「ペア」はどこですか? 「リスト」はどこですか?データのコンテナはどこですか?データはどこに保存されていますか?それはコードの中にあります。

コードはデータです。データはコードです。

conscar、およびcdrが実際に実装されているか、おそらくではありませんもちろん

が、我々は契約を満たしてきましたし、私たちはこれで本当にクールなもののすべての種類の構築を開始することができます。私たちは、薄い空気から引き出されたラムダだけでデータ構造を作りました!

+0

恐ろしい!あなたはとてもうまく説明しました。私の混乱はかなりクリアされますが、まだ混乱はほとんどありません。私がSICPで前進するにつれて、私はもっとそれを得るでしょう。ありがとう。 @naomik –

関連する問題