/ / Was ist '(Apostroph) im Schläger? - Funktionsprogrammierung, Schema, Schläger

Was ist (Apostroph) im Schläger? - funktionale Programmierung, Schema, Schläger

Ich bin etwas verwirrt über die Bedeutung der " Anmelden im Schläger. Es scheint mir, dass dasselbe Zeichen unterschiedliche Bedeutungen hat. Sehen Sie sich unten zwei einfache Beispiele an:

list

Gibt eine neu zugewiesene Liste mit den vs als Elementen zurück.

> (list 1 2 3 4)
"(1 2 3 4)

quote

Erzeugt einen konstanten Wert entsprechend Datum (d. h. die Darstellung des Programmfragments) ohne seine lexikalischen Informationen, Quellort usw. Zitierte Paare, Vektoren und Boxen sind unveränderlich.

> "(1 2 3 4)
"(1 2 3 4)

Meine Frage ist also: Tut das " Zeichen hat 2 Bedeutungen (a Symbol und ein Liste) oder sind diese vom selben Datentyp und list kehrt tatsächlich ein Zitierter konstanter Wert? Wenn das zweite der Fall ist, warum funktioniert das:

> "(+ (- 2 13) 11)
"(+ (- 2 13) 11)

> (eval (list + (- 2 13) 11))
0

(ebenfalls (eval "(+ (- 2 13) 11)) funktioniert und wertet richtig aus 0)

Aber das ist nicht:

> (list + (- 2 13) 11)
"(#<procedure:+> -11 11)

> (eval "(#<procedure:+> -11 11))
. read: bad syntax `#<"

Verwandte vielleicht: Was ist '(Apostroph) in Lisp / Schema?

Antworten:

3 für die Antwort № 1

> ist ein Zeichen für REPL - die Read-Eval-Print-Schleife.

Der erste Ausdruck, den Sie an der REPL-Eingabeaufforderung eingegeben haben, ist lessen - konvertiert in eine interne Darstellung des abstrakten Syntaxbaums. Dann ist diese interne Darstellung des eingetippten Ausdrucks bewertet d.h. sein Wert wird gefunden. Dann wird das Ergebnis gedruckt.

Wenn wir tippen

> (list 1 2 3 4)

Der eingegebene Ausdruck wird als verschachtelte Struktur gelesen. Schreiben wir ihn als

[LIST | [1 | [2 | [3 | [4 | NIL ]]]]]

entsprechend der üblichen Darstellung von Listen als Datenpaare und dem Rest der Liste (hier ein Paar von a und b wie [a | b]).

Dann wird die obige Struktur ausgewertet und weil ihr erstes Element war LIST es bewirkt den Aufruf von list mit den angegebenen Argumenten, wodurch eine neue Listenstruktur erstellt wird, die als dargestellt werden kann

[1 | [2 | [3 | [4 | NIL ]]]]

Dann wird es gedruckt, normalerweise als (1 2 3 4) aber Schläger wählt es als drucken "(1 2 3 4). Übrigens kann es nicht ausgewertet werden, weil 1 kann nicht sein namens.

Als nächstes den zitierten Ausdruck "(1 2 3 4), die gelesen wird als (quote (1 2 3 4)). Es wird in umgewandelt

[QUOTE | [ [1 | [2 | [3 | [4 | NIL ]]]] | NIL ]]

welche, wenn ausgewertet (gemäß der Bewertungsregel für quote), gibt das zurück Daten es erhielt Was wir als repräsentieren

[1 | [2 | [3 | [4 | NIL ]]]]

Deshalb sind die beiden ähnlich. Ob wir eine neue Liste mit 1, 2, 3 und 4 erstellen oder sie als Teil von erstellen lassen lessen Prozess, so wird es wortwörtlich zurückgegeben quote; Das Ergebnis ist das gleiche.


6 für die Antwort № 2

Sie sind durch die Standardeinstellung von verwirrt #lang racket von Druckwerten, die sich von fast allen anderen interaktiven Lisp-Umgebungen unterscheidet. Wenn Sie in DrRacket selbst eine andere Sprache wählen, zum Beispiel R5RS, werden Sie feststellen, dass es gedruckt wird:

> (list 1 2 3 4)
(1 2 3 4)

das ist das Ergebnis der Operator list auf die Zahlen 1 2 3 4 angewendet wird, um eine Liste dieser Zahlen zu erstellen, was genau die Interpretation von ist (1 2 3 4).

Also die Antwort auf Was ist '(Apostroph) in Lisp / Schema? gilt auch für Ihren Fall und "anything ist nur eine Abkürzung für (quote anything).