kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

fearofmacros

RacketのMacroを調べてみる (11)

ではSyntax: Meta-Programming Helpersを見ていきます 1 Parsing and Specifying Syntax ここではsyntax-parseとdefine-syntax-classを説明していく syntax-parseはsyntax patternにしたがって自動的にエラーメッセージを生成する 1.1 Introduction syntax-p…

RacketのMacroを調べてみる (10)

普通の関数でエラーに対応するには、エラーをチェックするコードを入れる以外に契約を用いたり、Typed (型付き) Racketを使うという手段があります マクロではこれまでfenderを入れたり、エラーチェックしてraise-syntax-errorを呼んだりしてましたが契約や…

RacketのMacroを調べてみる (9)

今回はanaphoric ifの話から > (aif (big-long-calculation) (foo it) #f) って書くと、(big-long-calculation)が#fのときは当然#fを返しますがそうでないときは(big-long-calculation)の結果をitが覚えててくれる、というもの普通はletでいったん変数に入れ…

RacketのMacroを調べてみる (4)

なんと下書きだけしてアップしてなかった分が! ---- 再掲 > (define-syntax (our-if-v2 stx) (define xs (syntax->list stx)) (datum->syntax stx `(cond [,(cadr xs) ,(caddr xs)] [else ,(cadddr xs)]))) めでたい?dの数とか数えたくないですね?パター…

RacketのMacroを調べてみる (8)

次の例ですちょっとエラー処理に凝ったりしてます 何をするかは説明するより見たほうが速いかな > (define js (hasheq 'a (hasheq 'b (hasheq 'c "value")))) > (hash.refs js.a.b.c) "value" hasheqというのはいわゆるハッシュテーブルを作る関数で、ここで…

RacketのMacroを調べてみる (7)

ここまでの集大成としてstructもどきを作りますこんな風に使えるものです > (our-struct person (name age)) > (define p (person "john" 24)) > p '#(person "john" 24) > (person-name p) "john" > (person-age p) 24 では定義です (define-syntax (our-st…

RacketのMacroを調べてみる (6)

ここらから少し応用編適当に端折っていきます ちゃんとしくみを理解してないと、の方針は続いていて、エラーを出したりそれを調べたりしながら順を追って関数名を作る話をしてくれます syntaxの内側でないとpattern variableは参照できない template内はpatt…

RacketのMacroを調べてみる (5)

再掲実はもうほとんどsyntax-caseになってます (define-syntax (our-if-using-match stx) (match (syntax->list stx) [(list name condition true-expr false-expr) (datum->syntax stx `(cond [,condition ,true-expr] [else ,false-expr]))])) syntax-case…

RacketのMacroを調べてみる (3)

なぜ関数ではなくてmacroで書くんでしょうかたとえば、ifを自分で定義してみます > (define (our-if condition true-expr false-expr) (cond [condition true-expr] [else false-expr])) 一見うまく行きそうですがそうは問屋がおろしません > (define (displ…

RacketのMacroを調べてみる (2)

今回はmacroの原理についてまずはtransformerからといっても実はただの関数です (define-syntax foo (lambda (stx) (syntax "I am foo"))) defineの代わりにdefine-syntaxを使うとマクロの定義になりますていうかこの文脈ではtransformerの定義と言ったほう…

RacketのMacroを調べてみる (1)

ちょっときっかけがありましてRacketのMacroを調べてみますCommon Lispのマクロを書くならOn Lisp だとか Practical Common Lisp だとか読めばよさそうなんですがSchemeのマクロは流派が分かれててあんまりそれっぽい本はなさそうです調べてみると Fear of M…