2017-12-25 12 views
3

Es ist sehr üblich, dass Scheme-Makros "abgeleitete" Bezeichner machen, so wie die Definition eines Datensatztyps foo (unter Verwendung der R6RS-API für syntaktische Datensätze) standardmäßig einen Konstruktor namens make-foo definiert. Ich wollte etwas ähnliches in meinem eigenen Makro machen, aber ich konnte keinen sauberen Weg innerhalb der Standardbibliotheken finden. Ich am Ende dieses Schreiben:Der sauberste Weg, um einen "abgeleiteten" Bezeichner zu erstellen?

(define (identifier-add-prefix identifier prefix) 
    (datum->syntax identifier 
       (string->symbol (string-append prefix 
               (symbol->string (syntax->datum identifier))))) 

I umwandeln ein Syntax-Objekt (angenommen eine Kennung zu sein) in ein Datum, konvertieren, das Symbol in einen String, stellen eine neue Zeichenfolge mit dem Präfix vorangestellt, konvertieren, die Zeichenfolge in eine Symbol und dann schließlich dieses Symbol in eine Kennung in der gleichen syntaktischen Umgebung wie identifier.

Das funktioniert, aber es scheint umständlich und unordentlich. Gibt es eine sauberere oder mehr idiomatische Möglichkeit, dies zu tun?

Antwort

1

Obwohl es möglicherweise kein hygienisches Makro ist, nehme ich an, dass Sie die Definitionssyntax wie folgt verwenden können (in hühnerschema). Für Hühnerschema ist die Dokumentation für Makros here. Auch this SO question wirft etwas Licht auf Hühnerschema-Makros. Schließlich weiß ich nicht, ob dies ein idiomatischer Weg wäre, um das Problem anzugehen.

(use format) 
(use srfi-13) 

(define-syntax recgen 
    (lambda (expr inject compare) 
    `(define (,(string->symbol (string-append "make-" (cadr expr)))) (format #t "called")))) 

#> (recgen "bar") 
#> (make-bar) 
called 

Die einzelne define oben auf einem veränderten werden kann (begin ...), die Getter/Setter oder andere Weise definiert mit der Aufzeichnung zu interagieren.

Verwandte Themen