cons car cdr
Allgemein Scheme
Nein, dies ist keine neue Automobilmarke
Über diese Begriffe / Wörter / Bezeichnungen oder wie auch immer bin ich gestossen und sie gehen auf die gute alte IBM 704 zurück <- Gleich der Link zu Wikipedia
Kategorie Nein, dies ist keine neue Automobilmarke
Über diese Begriffe / Wörter / Bezeichnungen oder wie auch immer bin ich gestossen und sie gehen auf die gute alte IBM 704 zurück <- Gleich der Link zu Wikipedia
Es war nämich wahrscheinlich, so dass die
erste oder eine der ersten Lisp Implementierungen auf so einer IBM 704
liefen.
Diese IBM 704 hatte ein Adressierungsschema, bei welchem man die "Adresse" und das "Dekrement" eines Speicherplatzes ansprechen konnte.
car steht für "Contents of Address part of Register"
cdr steht für "Contents of Decrement part of Register"
cons steht einfach nur für construct.
cdr wird "kudder" ausgesprochen.
OK, und was soll das nun?
Mittels cons können Paare definiert werden, kann man sich so vorstellen -> (cons 2 3) klebt die 2 und 3 als Paar zusammen, mittels (car (cons 2 3)) bekommt man 2 und (cdr (cons 2 3)) liefert die 3
Ist ja eigentlich nicht so spannend, ausser dass man Datenobjekte, welche man aus Paarbausteinen basteln kann auch listenstrukturierte Daten nennt.
Was mich aber schon ein wenig erstaunt hat, ist die Tatsache:
Das man dieses Konstrukt als universelle Bauteine zur Erzeugung aller Arten von komplexen Datenstrukturen einsetzen kann!
Als ich dies gelesen habe, war ich im ersten Moment ein wenig irritiert, aber wenn man ein wenig drüber nachdenkt, macht es schon Sinn.
Leider bin ich erst in Kapitel 2.1.1 und in Kapitel 2.2 werden wird man sehen mit welchen Beispielen die Behauptung untermauert wird.
Gruß JJR
P.S.: Hier der Code (auch wenn es keinen interessiert ) für das Rechnen mit rationalen Zahlen
P.P.S.: Bunt ist Textpad
(define (ggt a b)
(if (= b 0)
a
(ggt b (remainder a b))
)
)
(define (constr-rat n d)
(let ((g (ggt n d)))
(cons (/ n g) (/ d g)))
)
(define (numerator-rat x) (car x))
(define (denominator-rat x) (cdr x))
(define (add-rat x y)
(constr-rat
(+ (* (numerator-rat x) (denominator-rat y)) (* (denominator-rat x) (numerator-rat y)))
(* (denominator-rat x) (denominator-rat y))
)
)
(define (sub-rat x y)
(constr-rat
(- (* (numerator-rat x) (denominator-rat y)) (* (denominator-rat x) (numerator-rat y)))
(* (denominator-rat x) (denominator-rat y))
)
)
(define (mul-rat x y)
(constr-rat
(* (numerator-rat x) (numerator-rat y))
(* (denominator-rat x) (denominator-rat y))
)
)
(define (div-rat x y)
(constr-rat
(* (numerator-rat x) (denominator-rat y))
(* (denominator-rat x) (numerator-rat y))
)
)
(define (equal-rat? x y)
(= (* (numerator-rat x) (denominator-rat y)) (* (numerator-rat y) (denominator-rat x)))
)
(define (display-rat x)
(newline)
(display (numerator-rat x))
(display "/")
(display (denominator-rat x))
)
(display-rat (constr-rat 4 8))
(display-rat (div-rat (constr-rat 4 8) (constr-rat 1 3)))
Diese IBM 704 hatte ein Adressierungsschema, bei welchem man die "Adresse" und das "Dekrement" eines Speicherplatzes ansprechen konnte.
car steht für "Contents of Address part of Register"
cdr steht für "Contents of Decrement part of Register"
cons steht einfach nur für construct.
cdr wird "kudder" ausgesprochen.
OK, und was soll das nun?
Mittels cons können Paare definiert werden, kann man sich so vorstellen -> (cons 2 3) klebt die 2 und 3 als Paar zusammen, mittels (car (cons 2 3)) bekommt man 2 und (cdr (cons 2 3)) liefert die 3
Ist ja eigentlich nicht so spannend, ausser dass man Datenobjekte, welche man aus Paarbausteinen basteln kann auch listenstrukturierte Daten nennt.
Was mich aber schon ein wenig erstaunt hat, ist die Tatsache:
Das man dieses Konstrukt als universelle Bauteine zur Erzeugung aller Arten von komplexen Datenstrukturen einsetzen kann!
Als ich dies gelesen habe, war ich im ersten Moment ein wenig irritiert, aber wenn man ein wenig drüber nachdenkt, macht es schon Sinn.
Leider bin ich erst in Kapitel 2.1.1 und in Kapitel 2.2 werden wird man sehen mit welchen Beispielen die Behauptung untermauert wird.
Gruß JJR
P.S.: Hier der Code (auch wenn es keinen interessiert ) für das Rechnen mit rationalen Zahlen
P.P.S.: Bunt ist Textpad
(define (ggt a b)
(if (= b 0)
a
(ggt b (remainder a b))
)
)
(define (constr-rat n d)
(let ((g (ggt n d)))
(cons (/ n g) (/ d g)))
)
(define (numerator-rat x) (car x))
(define (denominator-rat x) (cdr x))
(define (add-rat x y)
(constr-rat
(+ (* (numerator-rat x) (denominator-rat y)) (* (denominator-rat x) (numerator-rat y)))
(* (denominator-rat x) (denominator-rat y))
)
)
(define (sub-rat x y)
(constr-rat
(- (* (numerator-rat x) (denominator-rat y)) (* (denominator-rat x) (numerator-rat y)))
(* (denominator-rat x) (denominator-rat y))
)
)
(define (mul-rat x y)
(constr-rat
(* (numerator-rat x) (numerator-rat y))
(* (denominator-rat x) (denominator-rat y))
)
)
(define (div-rat x y)
(constr-rat
(* (numerator-rat x) (denominator-rat y))
(* (denominator-rat x) (numerator-rat y))
)
)
(define (equal-rat? x y)
(= (* (numerator-rat x) (denominator-rat y)) (* (numerator-rat y) (denominator-rat x)))
)
(define (display-rat x)
(newline)
(display (numerator-rat x))
(display "/")
(display (denominator-rat x))
)
(display-rat (constr-rat 4 8))
(display-rat (div-rat (constr-rat 4 8) (constr-rat 1 3)))