Traversing Scheme-Funktion als Liste

8

Ist es nicht möglich, Funktionen in Schema wie jede andere Liste zu behandeln?

Grundsätzlich möchte ich Folgendes tun:

%Vor%

Ich habe eine ähnliche Diskussion darüber gefunden, und ich fühle mich ein wenig enttäuscht, wenn dies mit Scheme nicht möglich ist. Wenn ja, warum ist das unmöglich? Ist es in anderen lisps möglich?

BEARBEITEN: Geändert (cdr 'foo) zu (cdr foo) - es war irreführend. Ich frage, warum kann ich nicht auf eine Funktion als Liste zugreifen?

    
csl 06.03.2010, 17:59
quelle

7 Antworten

3

Ich wollte oft in der Lage sein, die gleiche Sache csl zu machen. Im Folgenden finden Sie ein schnelles Beispiel dafür, wie Sie dies in mzscheme tun können.

DrScheme 4.2

%Vor%

Ausgaben:

%Vor%     
Davorak 06.03.2010, 23:09
quelle
2

Ihre define -Form ist keine Funktion, sondern eine Funktionsdefinition. In der Tat ist es eine Abkürzung für

%Vor%

Lambda kann man sich als "Compiler-Aufruf" vorstellen. In diesem Fall erzeugt es eine Funktion, die diese Zeichenfolge zurückgibt. Define bindet dann diese Funktion an das Symbol% ​​co_de%.

Vergleichen Sie dies mit

%Vor%

, die nur die Zeichenfolge an das Symbol% ​​co_de% bindet. Was würde 'foo zurückgeben?

Nun ist es vorstellbar, dass eine Scheme-Implementierung tatsächlich speichert oder die Möglichkeit hat, das 'foo -Formular zu speichern, wenn eine Funktion an ein Symbol gebunden wird. Sie müssen die Dokumentation überprüfen, aber die Art der reinen Interpretation, die dies beinhaltet, hätte sicherlich Auswirkungen auf die Leistung.

Wenn Sie jedoch erreichen, wird das (cdr foo) -Formular zurückgegeben, nicht das lambda -Formular.

    
Svante 06.03.2010 18:42
quelle
2

MIT Scheme hat die Fähigkeit, dies zu tun. (Wenn Sie wirklich wollen, kommentieren Sie das und ich gebe Ihnen den Code. Ich musste einige undokumentierte Funktionen finden, um das zu ermöglichen.)

Es liegt jedoch nicht in der Definition der Scheme-Sprache, daher müssen Implementierungen dies nicht zulassen. Der Grund dafür ist, dass eine gute Scheme-Implementierung die Funktionen ändert, um Funktionen schneller zu machen. Dies bedeutet, dass Sie sie in einer anderen Sprache (entweder Maschinencode oder etwas ziemlich Low-Level) neu schreiben und alle nicht benötigten Bits herausnehmen müssen - zum Beispiel muss die + -Funktion im Allgemeinen überprüfen, ob ihre Argumente Zahlen sind, und Wenn ja, welche Art von Zahlen, aber wenn Ihre Funktion eine Schleife ist, die + aufruft, können Sie einfach einmal am Anfang überprüfen und die Funktion viel schneller machen.

Natürlich könntest du die Listen auch ohne all diese Probleme ohne allzu große Schwierigkeiten herumtragen. Aber wenn Sie versuchen würden, die Listen zu ändern , wie würde es funktionieren?

(Sie könnten es wieder zum Laufen bringen. Es wäre einfach mehr Arbeit für Implementierer, und da es normalerweise nicht in Programmen verwendet wird, wollen die meisten Leute es wahrscheinlich nicht tun.)

    
Noah Lavine 06.03.2010 18:56
quelle
2

In arglistig,

  

Guile & gt; (define (foo bar) 'baz)
  Guile & gt; (Prozedur-Quelle foo)
   (Lambda (bar) (Zitat baz))
  Guile & gt; (cdr (Prozedur-Quelle foo))
   ((bar) (Zitat baz))
  Guile & gt;

    
Gregory Marton 12.03.2010 01:16
quelle
1

'foo wertet ein Symbol aus, Sie können nicht die CDR eines Symbols nehmen.

Was Sie tun möchten, ist (cdr foo), aber das funktioniert nicht. Der Wert eines FOO ist eine Prozedur, keine Liste.

    
Rainer Joswig 06.03.2010 18:14
quelle
1

Sie können möglicherweise mithilfe von pp oder pretty-print auf die Funktion als Liste zugreifen. Allerdings müssen Sie Ihren Code möglicherweise auch im Debug-Modus ausführen. Dies ist jedoch sehr implementierungsabhängig. Ich weiß, dass es in Gambit-C funktionieren kann.

    
Jonathan Arkell 06.03.2010 18:35
quelle
1

(define (foo) ...) erzeugt ein kompiliertes Objekt, und es ist ein Wert - eine Prozedur .
Sie können nicht darüber iterieren, weil es kein s-Ausdruck ist.

Wie auch andere Vorschläge, sollten Sie Ihre Programmierumgebung überprüfen und auf
zugreifen wenn es irgendwelche Möglichkeiten für solche Aufgaben hat.

    
Nick Dandoulakis 06.03.2010 18:47
quelle