4

次のような新しい識別子を作成するマクロが必要です

(new-name first second) => first-second

新しいトップレベルのバインディングを定義するために使用できる

(define-syntax define-generic 
  (syntax-rules ()
    ((define-generic (name a b ...))
     (begin
       (define (new-name name data) 15)      ; <= create a new binding
       (define name (lambda (a b ...)
         (add (new-name name-data) 7))))))   ; <= use new identifier

私が設定した場合!「new-name」バインディングの値である場合、新しく作成されたプロシージャに影響するはずです。

4

2 に答える 2

2

ほんの数日前に、これについて Reddit で議論がありました。詳細については、投稿された実装を調べる価値があるかもしれません - http://www.reddit.com/r/scheme/comments/f54dk/i_wrote_an_hygienic_definemacro_that_can_capture/

于 2011-01-28T12:46:06.830 に答える
1

純正のR5RSではできません。幸いなことに、一般的な Scheme 実装のほとんどは、R5RS の限定された衛生的なものに加えて、適切なマクロ システムを提供します。

(define-macro (new-name a b) (string->symbol (string-append (symbol->string a) "-" (symbol->string b))))

于 2011-01-28T12:29:54.030 に答える