2008-12-04 6 views
5

Kann ein Makro in Schema geschrieben werden (mit define-syntax, zum Beispiel), die Ausdrücke wie folgt statt:Schema Makro für die Verschachtelung Ausdrücke

(op a b c d e f g h i j) 

Und Ausbeute Ausdrücke wie diese als Ausgabe?

(op (op (op (op (op (op (op (op (op a b) c) d) e) f) g) h) i) j) 

Natürlich für beliebige Längen. Ich kann nicht denken Sie an einen Weg, es zu tun, einige Vorlage wie folgt gegeben:

(define-syntax op 
    (syntax-rules() 
    [(_) 'base-case] 
    [(v1 v2 ...) 'nested-case??])) 
+0

Ich bin neugierig. War das nur eine Frage von theoretischem Interesse oder haben Sie einen interessanten Anwendungsfall? Im Allgemeinen würde diese Art von Umhüllung durch eine Falt-Linke erreicht werden. – namin

+0

hmm, guter Punkt. Ich habe das meistens gefragt, weil ich nicht an deinen Weg gedacht habe = P. ich wusste nicht, dass das genau das ist, was foldl macht. – Claudiu

Antwort

6
(define bop list) 

(define-syntax op 
    (syntax-rules() 
    ((op a b) (bop a b)) 
    ((op a b c ...) (op (bop a b) c ...)))) 

Zum Beispiel (op 1 2 3 4)-(bop (bop (bop 1 2) 3) 4) erweitert und ausgewertet (((1 2) 3) 4).

+1

Warum verwenden Sie BOP in den Literalbezeichnern, wenn Sie nicht übereinstimmen? – leppie

+0

Guter Punkt. Fest. – namin

+1

Schema-Makros sind wirklich wirklich schlau mit ihren ... sind sie nicht? – Claudiu

0

Um zu zeigen, wie die Antwort ausarbeitet:

(op 1 2 3 4) 

Dies ist ein op mit 4 Aussagen ist, so dass der zweite Fall wird mit a = 1, b = 2, c = 3, ... = ausgewählt 4:

(op (bop 1 2) 3 4) 

Dies ist ein Op mit 3 Anweisungen, also 2. Fall wieder. a = (BOP 1 2), b = 3, c = 4:

(op (bop (bop 1 2) 3) 4) 

Nun ist dies ein BOP mit 2-Anweisungen, so dass ein = (BOP (BOP 1 2) 3), b = 4, und es ist fertig.

1

Die Funktion, die Sie auf die Argumente anwenden möchten, sollte selbst ein Argument für das Makro sein. Abgesehen davon war meine Lösung die gleiche.

#!r6rs 

(import (rnrs base)) 

(define-syntax claudiu 
    (syntax-rules() 
    ((claudiu fun first second) 
    (fun first second)) 
    ((claudiu fun first second rest ...) 
    (claudiu fun (claudiu fun first second) rest ...)))) 
Verwandte Themen