2016-09-18 3 views

Antwort

2

Eine zusammengesetzte Prozedur besteht aus einer oder mehreren anderen Prozeduren. Das ist eine einfache, direkte Definition, aber es wird ein kleiner Trick, wenn wir versuchen, die gleichen Überlegungen auf Daten anzuwenden.

Ich glaube, das Beispiel Harold Abelson in der Vorlesung gibt etwas entlang der Linien von ist:

Dies wird aus dem Speicher zu paraphrasieren - Harold Abelson, ich hoffe, ich habe Sie Gerechtigkeit hier getan.

Stellen wir ein +rat Verfahren, das nahm Zahlen machen waren: numer1, numer2, denom1 und denom2. Nannte es könnte wie folgt aussehen:

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

Nun stell dir vor, wenn wir diese weiter unterstützen Multiplikation erweitern wollten, würden Sie auch weiterhin wirklich haben, um mehrere Variablen für jede rationale Zahl einführen

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

Dies ist immer unordentlich schnell. Was wäre, wenn wir unsere rationalen Zahlen wie einfache Zahlen verarbeiten könnten? Was wäre, wenn wir die einzelnen Komponenten (numer und denom) nicht immer berücksichtigen müssten? Was wäre, wenn wir mit unseren rationalen Zahlen als zusammengesetzte Daten umgehen könnten?

;; 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) 

Jetzt können wir unsere Berechnungen viel besser ausdrücken. Vergleichen Sie dies mit dem Hinzufügen ganzer Zahlen

(+ 1 2) 
(* (+ 1 2) 3) 

Wir können über diese Ausdrücke sehr leicht zu verstehen. Wir müssen uns nicht mit den einzelnen Komponenten (numer und denom) unserer rationalen Nummern beschäftigen, sondern können direkt mit den zusammengesetzten Daten arbeiten. Dies belastet uns enorm, da unser Programm immer komplexer wird.

;; 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)))) 

In der nicht-naive Implementierung erwartet die Prozedur x und y Werte zu sein, die mit make-rat konstruiert wurden - oder zumindest müssen sie gültig numer und denomSelektoren haben. Wenn Sie das Verfahren auf diese Weise schreiben, können wir zusammengesetzte Daten - anstatt einfacher, separater Teile - herumreichen und bei Bedarf in unseren Prozeduren aufteilen.

aus dem Speicher paraphrasieren; Quelle: SICP Lecture 2B: Compound Data

Wie auch immer, du hast Recht die Frage stellen werden. Die Tatsache, dass zusammengesetzte Prozeduren und zusammengesetzte Daten eine ähnlich aussehende Syntax haben, bedeutet, dass wir effektiv die Zeilen zwischen Code und Daten verwischt haben.

Mind Explosion: Code ist Daten; Daten sind Code.

SICP weiter lesen. Es hat mein Leben verändert.


Bonus Soda!

Diese Idee von Daten als Code ist sehr interessant für mich. Ich habe nie Dinge wie Objekte und Arrays in Frage gestellt, als ich andere Sprachen studierte. Aber als ich SICP studierte und über Daten anders nachdachte, fragte ich cons, car und cdr - was sind sie genau?

Letztendlich wie sie implementiert sind, spielt keine Rolle. Wenn wir nur über diese 3 Verfahren besorgt sind, müssen wir über den Vertrag nachdenken, den sie erfüllen, und hellip;

- - - - Contract - - - - 

For any x and y 

    (car (cons x y)) is x 

    (cdr (cons x y)) is y 

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

Es war nicht, bis ich Lambda Calculus dass studierte, sah ich eines der schönsten Dinge, die ich jemals gesehen habe. Ich werde Sie hier in Scheme & Hellip zeigen;

(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 

Was! Wo ist das "Paar"? Wo ist die "Liste"? Wo ist der Container für die Daten? Wo sind die Daten gespeichert? Es ist genau dort im Code.

Code ist Daten; Daten sind Code.

Natürlich, das ist wahrscheinlich nicht, wie cons, car und cdr tatsächlich umgesetzt werden, aber wir haben den Auftrag erfüllen und wir konnten bauen alle Arten von wirklich coolen Sachen mit dieser beginnen. Wir haben eine Datenstruktur aus nichts als Lambdas gemacht - aus dem Nichts gezogen!

+0

Super! Du hast es sehr gut erklärt. Es löscht meine Verwirrung sehr, aber hat immer noch wenig Verwirrung. Ich werde es mehr bekommen, wenn ich in SICP voran gehe. Vielen Dank. @ Naomik –

Verwandte Themen