Wie schreibt man ein MIT Scheme-Makro, um eine Lambda-Form zurückzugeben?

8

Ich bin verblüfft, wenn ich versuche, das Äquivalent dieses trivialen (in Common Lisp) Makros in MIT Scheme zu erstellen:

%Vor%

Dies ist für ein einfaches persönliches Projekt, ein numerischer Gleichungslöser, der auf den in der zweiten SICP-Vorlesung aufgebauten Funktionen basiert. Es ist mir egal, dass dieses Makro nicht "sicher" oder "hygienisch" ist oder eine Variable erfassen wird, wenn das EXP auf andere Symbole als "x" verweist. Ich würde gerne in der Lage sein zu schreiben

%Vor%

wo solv ist:

%Vor%

anstelle von

eingeben zu müssen %Vor%

Aber kann nicht herausfinden, wie man das mit den Syntaxregeln von MIT Scheme macht.

Ich habe es versucht, aber es funktioniert nicht:

%Vor%

Ich habe andere Dinge ausprobiert, die wahrscheinlich nicht erwähnenswert sind und eval beinhalten, aber ohne Erfolg.

Auch Verweise auf gute Tutorials (keine Referenzen) auf Scheme's Makro-System, die mit kleinen einfachen Beispielen beginnen und aufbauen, mit ausführlichem Kommentar, und insbesondere zeigen, wie LISP-Makros im Backquote-Komma-Stil konvertiert werden (was für mich hoch ist intuitiv) zu Schemes Syntax-Makro-System wäre großartig.

    
Bogatyr 12.10.2011, 17:01
quelle

2 Antworten

4

Sie können im Prinzip dasselbe tun wie mit defmacro , indem Sie explizite Umbenennung von Makros . Der einzige wesentliche Unterschied besteht darin, dass Sie das Eingabeformular selbst destrukturieren müssen:

%Vor%     
Matthias Benkard 12.10.2011, 17:52
quelle
7

Dies ist in syntax-rules nicht möglich. Ende der Geschichte.

Wenn Sie einen beliebigen Bezeichner ( x , in Ihrem Fall) in den Ausgabeausdruck einfügen, müssen Sie die Hygiene verletzen, und syntax-rules bietet keine Möglichkeit, die Hygiene zu ändern. Sie müssen dazu ein untergeordnetes Makro-System verwenden. MIT Scheme verwendet explizite Umbenennung (siehe Matthias Benkards Antwort), aber für andere Scheme-Implementierungen, die syntax-case verwenden, können Sie dies folgendermaßen tun:

%Vor%

Der Schlüssel ist das (datum->syntax stx 'x) -Bit, das das Symbol% ​​co_de% einfügt, als ob es im syntaktischen Kontext des Aufrufs x wäre.

Nebenbei bemerkt, Ihr funcify muss auch ein Makro sein, keine Prozedur, aber zumindest kann es ein solv Makro sein:

%Vor%     
Chris Jester-Young 12.10.2011 17:44
quelle

Tags und Links