bgnori / broom

golang practice.
1 stars 0 forks source link

quasiquote/unquote等のマクロ作成支援 #11

Closed bgnori closed 10 years ago

bgnori commented 10 years ago

論点:

4.9 準クオート(Quasiquote), gauche

2重 quasiquote , @togetter

"今から実装するならr6rs互換にしておくのが良いのでは。" by shiro

R5RSに普通に書いてあった. "準引用形式は入れ子にしてもよい。 置換は,最外のバッククォートと同じ入れ子レベルで現れる被 unquote 要素に対してだけ行われる。 入れ子レベルは,準引用に入って行くたびに1だけ増え,unquote される要素に入って行くたびに 1だけ減る。"

ああそうか。CLでは`, はread時に解釈されて「リストを作るコード」へと展開されるため、 対応する `が無い,を書くことができない。 `,',a はエラーになる。Schemeでは `,は単なるS式の略記で、 評価される時に始めて意味を持つ。 思い出した。前提として、unquoteが意味を持つのはquasiquoteの中だけなので、 「quasiquoteを伴わないunquoteを生成する」ということは考えない。これでCLと共通して議論できる。(続く) そんで、一度展開した結果が `...., になるとして、の部分を最初の展開で置き換えたければ ` `....,',a、の部分を最初の展開では置き換えずに次の展開で置き換えたいなら ` `...,,'a、 これがイディオム。

Clojure要調査.

Clojure Macro Tutorial (Part I, Getting the Compiler to Write Your Code For You)

bgnori commented 10 years ago

案: (Scheme的)

Clojureだと

readerで扱うtokenが異なるだけで, 処理するS-Exprは同じだろう.

(defmacr [x & rest] ...)などで受け取ったらrestを展開する時にArrayじゃなくてPairだとかいう実装上の問題.

bgnori commented 10 years ago

,@restの書き間違いだなぁ.

(let [x gensym]
  `(+ ,x 1))
`(+ ~x 1)

gensymとその利用, unquoteを組み合わせた記法はどうなんだろう. 仮にgqとでも呼ぶか. S-Exprはこう. qqをネストされると危険な感じがする.

(qq (+ (gq x) 1)
bgnori commented 10 years ago

多重はとりあえずはやらない. その場合は再度開く.

5c394ffdb8553f541a7d5845de046938572066d5