2017-12-25 44 views
3

Schemeマクロでは、「R6RS構文レコードAPIを使用して」レコードタイプfoo(デフォルトではmake-fooというコンストラクタを定義する)を定義する方法など、「派生」識別子を作成するのが一般的です。私は自分のマクロで似たようなことをしたいと思っていましたが、標準ライブラリの中には何のきれいな方法も見つけられませんでした。"派生"識別子を作る最もクリーンな方法は?

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

私は、データムに文字列の中に、そのシンボルに変換(識別子とする)構文オブジェクトに変換するには、先頭に追加接頭辞を持つ新しい文字列を作るにその文字列を変換:私はこれを書いてしまいました最後にシンボルをidentifierという同じ構文環境の識別子に変換します。

これはうまくいきますが、うっとりしているようです。これを行うクリーナーかイディオムの方法がありますか?

答えて

1

衛生的なマクロではないかもしれませんが、私はこのようなdefine-syntaxを使用することができると考えています。 ニワトリのスキームでは、マクロのドキュメントはhereです。またthis SO questionは、チキンスキームマクロにいくつかの光を当てます。最後に、これが問題に近づく慣習的な方法であるかどうかわかりません。

(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 

上記の単一の定義は、ゲッター/セッターまたはレコードとやりとりする他の方法を定義する(begin ...)に変更できます。

関連する問題