Scheme: Nutzung eigener Macros/Funktionen in Macros



  • Hallo,

    ich habe folgenden Code (der bereits funktioniert, wenn er auch etwas sinnlos ist):

    (define-macro global (lambda (name)
                           (let ((string-name (symbol->string name)))
                                `(begin
                                   (define ,(string->symbol (string-append "init-" string-name))
                                     (lambda (,name) (lambda (value) (if (equal? value #f) ,name (set! ,name value)))))
    
                                   (define ,(string->symbol (string-append "global-" string-name))
                                     (,(string->symbol (string-append "init-" string-name)) #f))
    
                                   (define ,(string->symbol (string-append "write-" string-name))
                                     (lambda (value) (,(string->symbol (string-append "global-" string-name)) value)))
    
                                   (define ,(string->symbol (string-append "read-" string-name))
                                     (lambda () (,(string->symbol (string-append "global-" string-name)) #f)) )))))
    

    Und wollte nun alle "(string->symbol (string-append "***" string-name))"
    Gegen ein entsprechendes Macro/Funktion ersetzten, um mir Schreibarbeit
    zu ersparen. Anscheinend kann man aber in Scheme, anders als ich es von
    CommonLisp kannte, innerhalb des Macros keine eigenen Funktionen oder
    Macros aufrufen. Bsp:

    ...
    (define ,(string->symbol (string-append "read-" string-name))
                                     (lambda () (,(create-symbol "global-" string-name) #f)) )))))
    
    => reference to undefined identifier: create-symbol
    

    Ich kann den Code höchstens zu etwas expandieren lassen
    das eigene Macros/Funktionen enthält. Dies geht in diesem Fall nicht
    weil ich sonst mit den defines in Konflikt komme.

    Lange Rede, kurze Frage: Wie bastle ich in obigen Code, diese Funktion oder
    das entsprechende Macro ein?

    (define create-symbol (lambda (string symbol)
                                  (string->symbol (string-append string (symbol->string 'symbol)))))
    
    (define-macro create-symbol (lambda (string symbol)
                                  `(string->symbol (string-append ,string (symbol->string ',symbol)))))
    

    Ich vermute bereits mal das soetwas einfach nicht geht...

    Danke



  • Wenn Macros nicht laufen wollen, dann mache es eben mit Funktionen direkt aus dem Programm!


Anmelden zum Antworten