2011-11-03 15 views
7

Racketマクロシステムを学ぶために経験豊富な命令型プログラマがCマクロに慣れている最良のルートは何ですか?それの仕組みだけではなく、それを使用する場所と理由、そしてこれを説明する例もあります。命令型プログラマのためのラケットマクロシステムを学ぶ最も良い方法

最初にScheme(またはLisp)マクロを学習する必要がありますか?私は、 "On Lisp"という本にLispマクロの優れた説明があり、優れた使用例があると聞いてきました。これは有用かどうか?

+0

この質問は3年前に聞かれ、2つの良い答えがありました。私はなぜそれを「保留」にしておくのが役に立つのか、特に保留にしている人々はこの分野での経験がないために役立ちませんでした。 –

+0

それは私がサムに疑問を持っていたものです:-) –

+0

ハリー、あなたはこの質問を再開するために投票すべきです。 –

答えて

6

Racket's documentationは、excellent tutorial on using macrosを有する。

以前はどんな種類のLispマクロも扱っていないのであれば、CLマクロよりSchemeマクロをお勧めします。これは、Schemeマクロがパターンマッチングを使用するためであり、読みやすくなっています。

(ラケットのdefine-syntax-ruleを使用)例:

(define-syntax-rule (let ((var val) ...) 
         expr ...) 
    ((lambda (var ...) 
    expr ...) 
    val ...)) 

これは、それを適用し、その後、対応するラムダを作成する点でletを定義する非常に単純なマクロです。読むのは簡単ですし、それが何をするのかを簡単に判断することができます。

やや複雑マクロ:

(define-syntax let* 
    (syntax-rules() 
    ((let*() 
     expr ...) 
    (let() 
     expr ...)) 
    ((let* ((var val) next ...) 
     expr ...) 
    (let ((var val)) 
     (let* (next ...) 
     expr ...))))) 

バインディングが順次行われるように、これは、ネストされたlet Sの点でlet*を定義します。これには、基本的なケース(バインディングなし)と再帰的なケースが含まれています。

+0

これにはどんな本もお勧めできますか? –

+1

本についてはわかりませんが、Racketはマクロのための優れたガイドを持っています:http://docs.racket-lang.org/guide/macros.html –

+0

これはより直接的な答えですので、このポインタで回答を更新する必要があります元の質問に... –

12

マクロのベストチュートリアルはまだKent Dybvigの"Writing Hygenic macros in Scheme with syntax-case"だと思います。これは特にラケットに関するものではありませんが、基本的にすべてが引き継がれ、上記のChrisが残っている違いをカバーするguideを読んでいます。名前にもかかわらず、それは "ハイジェニック"と "非ハイジェニック"マクロの両方を対象としています。

編集2014年7月:

私は上記を書いたので、グレッグHendershottはFear of Macros題しラケットのマクロの素晴らしいチュートリアルを、書かれています。ラケットマクロの学習を開始するのに最適な場所です。

+2

+1のDybvigの記事。私は実際にそれを少し前に読んでいて、 'syntax-case'マクロ、特に' with-syntax'のようなものがどのように働いているのかを理解する助けになりました。 –

関連する問題