Dies ist eine statische Kopie unseres alten Forums. Es sind keine Interaktionen möglich.
This is a static copy of our old forum. Interactions are not possible.

Helicase

Trainee

  • "Helicase" is male

Posts: 85

Date of registration: Oct 3rd 2006

21

Thursday, November 23rd 2006, 10:07am

klar geht das. Einfach

(append (list 1 2 3 4) (list (car andere_liste)))

zur Not kannst du das ja auch ganz einfach mal unten in der Konsole ausprobieren :)

Kojack

Trainee

Posts: 97

Date of registration: Oct 10th 2006

22

Thursday, November 23rd 2006, 10:35am

Okay, aber warum bekomme ich dann sowas hier da raus und keine richtige Liste? (2 3 4 5 . 0)

Und weißt du zufällig auch was diese Fehlermeldung bedeutet?

expected argument of type <proper list>
Niveau sieht von unten oft aus wie Arroganz

neweb

Erfahrener Schreiberling

  • "neweb" is male

Posts: 496

Date of registration: Jun 16th 2006

Location: Hannover

23

Thursday, November 23rd 2006, 11:00am

Versuch mal das hier:

(append (list 1 2 3) (list (car (list 2 3 4))))
<edit>
Könnte es sein, dass du keine richtige Liste anhängst. Du hast wahrscheinlich die Liste mit den Cons mit der Zahl hinter dem . abgeschlossen und nicht mit einem Zeiger. Änder mal den letzten Eintrag in die Liste von (cons 5 0) auf (cons 5 (cons 0 '())).
</edit>

So... da ich jetzt den Thread auch mal gelesen haben noch einmal zu dem Murks mit den Arrays. Arrays haben erst einmal nix mit Zeigern zu tun. Auch wenn machen Sprachen (wie PHP und Co) Arrays nicht kennen und prinzipiell mit verketteten Listen arbeiten, sind das noch lange keine Arrays und spätestens in Java wird man damit ziemliche Probleme bekommen.

Array sind fest definierte Speicherzellen, die genau nacheinander im Speicher angeordnet sind und somit eine Reihe im Speicher bilden. Somit ist ein Zugriff über Indizes möglich. Das heißt aber auch dass ein Array immer eine definierte Länge hat und nicht wachsen kann, ohne dass man die Daten in ein neues Array kopiert was größer ist. Das ganze sieht im Speicher so aus:

[ ... DATEN ... ] [ 1. Array Element ] [ 2. Array Element ] [... ] [ n. Array Element ] [... weitere Daten ... ]

Der Zugriff erfolgt dann über Indizierte Adressierung (z.B. Array Element [m], wobei 0 <= m < n). Man kann natürlich in einem Array Zeiger ablegen, keine Frage. Ansonsten hat ein Array wenig mit Zeigern zu tun. Man beachte, dass ein Zugriff auf jedes Array-Element mit einem Speicherzugriff möglich ist:

Lesen des Speicherinhaltes an der Adresse (Adresse vom 1. Array Element + (m * Größe von (1. Array Element)))

Die Elemente müssen alle die gleiche Größe (Bedarf an Speicherzellen) haben. Der Zugriff ist sehr schnell.

Eine verkettete Liste funktioniert dagegen ganz anders. Ein Element zeigt hierbei auf das nächste. Somit ist ein direkter Zugriff überhaupt nicht möglich. Es kann immer nur auf den Kopf der Liste zugegriffen werden (lässt man Hashlisten, etc. mal außen vor). Von dem Kopf kommt man dann zu nächsten, von dem dann zum übernächsten....

Dafür ist eine solche Struktur sehr Variabel und kann im Speicher wachsen. In PHP werden Intern alle Arrays als Listen behandelt. Daher können die Arrays auch wachsen. Dabei wird bei jedem Zugriff per Index die Liste bis zum passenden Element durchgegangen (natürlich arbeitet PHP etwas komplexer um die Zugriffe kurz zu halten). Da dies in anderen Programmiersprachen ähnlich ist führt dies oft missverständnissen bei der Definition von Arrays.

Auf jeden fall muss man aufpassen, dass man diese Datenstrukturen nicht durcheinander wirft.

Eine Liste bekommt man in Scheme immer genau dann, wenn cons als 2. parameter eine liste oder einen weiteren cons hat. So wird Scheme folgenden Ausdruck mit Ja beantworten:
(list? (cons 2 (cons 2 '())))

Diesen jedoch lieber mit nein:
(list? (cons (cons '() 2) 2))
Das Wesen der Dinge ist es, dass sie plötzlich verschwinden und dann unerwartet an einem ganz anderen Ort wieder auftauchen.

This post has been edited 4 times, last edit by "neweb" (Nov 23rd 2006, 12:32pm)


ctk

Trainee

  • "ctk" is male

Posts: 113

Date of registration: Oct 15th 2004

24

Thursday, November 23rd 2006, 3:42pm

Quoted

Original von neweb
Eine Liste bekommt man in Scheme immer genau dann, wenn cons als 2. parameter eine liste oder einen weiteren cons hat.

Etwas treffender ist vl folgende rekusive Definition:
Eine Liste ist entweder die leere Liste oder ein Paar dessen cdr-Teil eine eine Liste ist
Technik ist der Wettlauf der Intelligenz mit der Kreativität der Narren.
Bis heute haben die Narren immer gewonnen.

This post has been edited 1 times, last edit by "ctk" (Nov 23rd 2006, 10:50pm)


Armin1906

Praktikant

  • "Armin1906" is male

Posts: 21

Date of registration: Nov 10th 2006

Location: Hannover

Occupation: Mathe-Informatik / 6

25

Thursday, November 23rd 2006, 5:16pm

Quoted

Original von iriania
Eine Scheme-Liste hat folgende Eigenschaften:
1. Sie ist leer ()
oder
2. Sie enthält einen oder mehrere Elemente, wobei diese Elemente nur durch Leerzeichen voneinander getrennt sind, also nicht durch Punkte, Kommata, etc.

Ich erinnere mich daran, dass ich die Frage, ob z.B.
(cons (cons 1 2) (cons 3 (cons 4 (cons (cons 5 6) (cons 7 (cons (cons 8 9) ’()))))))

eine Liste ist oder nicht immer dadurch gelöst habe, indem ich mir die Endform davon in der Ausgabe angesehen habe.

so soll eine Liste in der Ausgabe aussehen:
(1 2 3 (5 4 6) 3 2)
oder so:
(1 2 3 4 5 6 7 8 )
oder so:
()
aber niemals so:
(1 . 2 3 4 5)
oder
(1 2 3 4 . 5)
ich hoffe, es ist klar, was ich sagen wollte - Scheme ist für mich schon länger her und ich habe auch kein drScheme mehr auf meinem PC.



Hallo :D

ist diese Definition nun richtig? Weil nach der Def. wären folgende Strukturen keine Listen ? Oder sehe ich da was falsch ???

(cons (cons 1 2) (cons 3 (cons 4 (cons (cons 5 6) (cons 7 (cons (cons 8 9) ’()))))))
(cons 1 (cons 2 (cons 3 (cons (cons 4 5) (cons 6 (cons 7 (cons (cons 8 ’()) 9)))))))
(cons 1 (cons 2 (cons 3 (cons 4 (cons 5 (cons 6 (cons (cons 7 8) (cons 9 ’()))))))))
(cons ’() (cons (cons (cons 1 (cons 2 (cons (cons 3 4) 5))) (cons (cons 6 7) 8)) 9))
(cons (cons (cons (cons (cons (cons (cons 1 (cons 2 (cons 3 4))) 5) 6) 7) 8) 9) ’())


Wobei natürlich 8) gleichzusetzen ist mit 8 ) ohne Leerzeichen.

neweb

Erfahrener Schreiberling

  • "neweb" is male

Posts: 496

Date of registration: Jun 16th 2006

Location: Hannover

26

Thursday, November 23rd 2006, 5:25pm

Quoted

Original von Armin1906
ist diese Definition nun richtig? Weil nach der Def. wären folgende Strukturen keine Listen ? Oder sehe ich da was falsch ???

(cons (cons 1 2) (cons 3 (cons 4 (cons (cons 5 6) (cons 7 (cons (cons 8 9) ’()))))))
(cons 1 (cons 2 (cons 3 (cons (cons 4 5) (cons 6 (cons 7 (cons (cons 8 ’()) 9)))))))
(cons 1 (cons 2 (cons 3 (cons 4 (cons 5 (cons 6 (cons (cons 7 8) (cons 9 ’()))))))))
(cons ’() (cons (cons (cons 1 (cons 2 (cons (cons 3 4) 5))) (cons (cons 6 7) 8)) 9))
(cons (cons (cons (cons (cons (cons (cons 1 (cons 2 (cons 3 4))) 5) 6) 7) 8) 9) ’())


Wobei natürlich 8) gleichzusetzen ist mit 8 ) ohne Leerzeichen.


Wenn du diese Befehle ausführst, siehst du, dass dies wohl nicht stimmt:

Source code

1
2
3
4
5
(list? (cons (cons 1 2) (cons 3 (cons 4 (cons (cons 5 6) (cons 7 (cons (cons 8 9) ’())))))))

(list? (cons (cons (cons (cons (cons (cons (cons 1 (cons 2 (cons 3 4))) 5) 6) 7) 8)  9) '()))

(list? (cons 1 (cons 2 (cons 3 (cons 4 (cons 5 (cons 6 (cons (cons 7 8) (cons 9 '())))))))))


Smilies kannst du übrigens mit "Optionen -> Smilies in diesem Beitrag deaktivieren" ausstellen.

Herzlich Willkommen im Forum ;)
Das Wesen der Dinge ist es, dass sie plötzlich verschwinden und dann unerwartet an einem ganz anderen Ort wieder auftauchen.

This post has been edited 1 times, last edit by "neweb" (Nov 23rd 2006, 5:27pm)


  • "Schokoholic" is male

Posts: 2,518

Date of registration: Oct 4th 2006

Location: Hannover

Occupation: Haarspaltung

27

Thursday, November 23rd 2006, 6:27pm

Was ich ganz hilfreich finde um zu erkennen ob etwas eine Liste ist ist, es einfach mit DrScheme eingerückt zu schreiben:

Source code

1
2
3
4
5
6
7
(cons (cons 1 2)
      (cons 3
            (cons 4
                  (cons (cons 5 6)
                        (cons 7
                              (cons (cons 8 9)
                                    '()))))))


Da sieht man ganz gut, was jeweils das zweite Element, also das (cdr) von jedem (cons) ist. Nach der Definition musst das (cdr) ja entweder die leere Liste oder eine Liste sein, wenn es die Struktur eine Liste sein soll.
Also guckt man sich immer das cdr an und wenn man irgendwann auf die leere Liste trifft, dann ist auch der ganze Ausdruck eine Liste.

Dass dann z.B. in der vierten Zeile ein (cons) steht, das keine Liste ist, hat keine Auswirkungen, da es ja nicht das cdr vom übergeordneten cons ist.

Armin1906

Praktikant

  • "Armin1906" is male

Posts: 21

Date of registration: Nov 10th 2006

Location: Hannover

Occupation: Mathe-Informatik / 6

28

Thursday, November 23rd 2006, 6:58pm

Quoted

Original von Schokoholic
Was ich ganz hilfreich finde um zu erkennen ob etwas eine Liste ist ist, es einfach mit DrScheme eingerückt zu schreiben:

Source code

1
2
3
4
5
6
7
(cons (cons 1 2)
      (cons 3
            (cons 4
                  (cons (cons 5 6)
                        (cons 7
                              (cons (cons 8 9)
                                    '()))))))


Da sieht man ganz gut, was jeweils das zweite Element, also das (cdr) von jedem (cons) ist. Nach der Definition musst das (cdr) ja entweder die leere Liste oder eine Liste sein, wenn es die Struktur eine Liste sein soll.
Also guckt man sich immer das cdr an und wenn man irgendwann auf die leere Liste trifft, dann ist auch der ganze Ausdruck eine Liste.

Dass dann z.B. in der vierten Zeile ein (cons) steht, das keine Liste ist, hat keine Auswirkungen, da es ja nicht das cdr vom übergeordneten cons ist.


1. Okay, also ist das zweite cons in Zeile 4 für sich keine Liste (weil es im cdr kein '() oder eine Liste hat). Und das cons in Zeilen 3 ff. ist eine Liste, da es im cdr eine Liste hat. Richtig oder falsch erklärt ?

2. Aufgabenstellung: Welche der folgenden Strukturen sind Listen? Begründen Sie Ihre Antwort. (Strukturen s.o.)

Ist damit gemeint ich soll jedes einzelne cons auf die Definition prüfen? Oder alles zusammenhängend ? ?(

This post has been edited 2 times, last edit by "Armin1906" (Nov 23rd 2006, 6:58pm)


oixio

Senior Schreiberling

  • "oixio" is male

Posts: 517

Date of registration: Oct 3rd 2004

29

Thursday, November 23rd 2006, 7:45pm

Na es sind 5 Ausdrücke - und zu jedem dieser sollst du die Frage beantworten.
Dieser Post wurde aus 100 % chlorfrei gebleichten, handelsüblichen, freilaufenden, glücklichen Elektronen erzeugt!

neweb

Erfahrener Schreiberling

  • "neweb" is male

Posts: 496

Date of registration: Jun 16th 2006

Location: Hannover

30

Thursday, November 23rd 2006, 9:05pm

Quoted

Original von ctk

Quoted

Original von neweb
Eine Liste bekommt man in Scheme immer genau dann, wenn cons als 2. parameter eine liste oder einen weiteren cons hat.

Etwas treffender ist vl folgende rekusive Definition:
Eine Liste ist entweder die leere Liste oder ein Paar aus einer belibigen Variable und einer Liste

Gegenbeispiel:

(cons (cons 7 '()) 2)

:) Ordnung muss sein
Das Wesen der Dinge ist es, dass sie plötzlich verschwinden und dann unerwartet an einem ganz anderen Ort wieder auftauchen.

This post has been edited 1 times, last edit by "neweb" (Nov 23rd 2006, 9:06pm)


  • "Schokoholic" is male

Posts: 2,518

Date of registration: Oct 4th 2006

Location: Hannover

Occupation: Haarspaltung

31

Thursday, November 23rd 2006, 9:26pm

Quoted

Original von Armin1906
1. Okay, also ist das zweite cons in Zeile 4 für sich keine Liste (weil es im cdr kein '() oder eine Liste hat). Und das cons in Zeilen 3 ff. ist eine Liste, da es im cdr eine Liste hat. Richtig oder falsch erklärt ?


Richtig. Und das erste cons in der ersten Zeile ist demensprechend auch eine Liste.

ctk

Trainee

  • "ctk" is male

Posts: 113

Date of registration: Oct 15th 2004

32

Thursday, November 23rd 2006, 10:51pm

Quoted

Original von neweb

Gegenbeispiel:

(cons (cons 7 '()) 2)

:) Ordnung muss sein


Dann nochmal für die Haarspalter unter uns :] :
Eine Liste ist entweder die leere Liste oder ein Paar dessen content of decrement register eine Liste ist

Source code

1
2
3
4
(define (list? x)
   (cond ((null? x) #t)
            ((pair? x) (list? (cdr x)))
            (else #f)))
Technik ist der Wettlauf der Intelligenz mit der Kreativität der Narren.
Bis heute haben die Narren immer gewonnen.

This post has been edited 2 times, last edit by "ctk" (Nov 24th 2006, 4:25pm)