Ich benutze häufig Rackets Pattern-Matching-Konstrukt match
, und ich dachte mir einen Weg, um Debuggen von Programmen mit match
, und um zu lernen, wie Racket/Scheme-Makros zu arbeiten, wäre ein Makro zu erstellen Informationen darüber, welches Muster gefunden wurde.Aufsteigende Zahlen in Makrodefinition
Mit anderen Worten, ich suche ein Makro, das, diese gegeben zu erstellen:
(match/debug 'two
['one 1]
['two 2])
Ausgänge etwas wie folgt aus:
Das Haupthindernis weitCase 2 <-- Printed
2 <-- Returned value
so versucht hat, zu erhalten die Zahlen bedeuten, dass der aufgelöste Fall korrekt angezeigt wird.
Mein Ziel war es, zu versuchen, etwas zu schreiben, die wie folgt erweitern würde:
(match 'two
['one (displayln "Case 1") 1]
['two (displayln "Case 2") 2])
Aber ich habe nicht in der Lage gewesen, eine Art und Weise, um herauszufinden, diese „Case #“ Strings zu erzeugen.
Hier ist meine versucht Makrodefinition:
(define-syntax-rule (match/debug id [pattern value] ...)
(let ([index 0])
(match id
[(begin
(set! index (add1 index))
pattern)
(printf "Case ~a\n" index)
value] ...)))
Es scheint, als ob die Syntax von match
wird mir so etwas wie dies nicht zulassen, aber das war der einzige Weg, ich denken konnte. Ich bin nur an den Stil von Common Lisp gewöhnt.
Funnily genug ... Ich landete tatsächlich auf die zitierte Muster verwenden, es gab mir genügend Informationen. Aber danke für die schnelle und gründliche Antwort! – mellowmaroon