quasiquote

quasiquoteがなんとか動いた。

quasiquoteのネストレベルの増減をどう追跡すべきかは初期段階で明白ではなかった。

dot表記が混じった場合、

`((foo ,(- 10 3)) ,@(cdr '(c)) . ,(car '(cons)))

現状のs式パーサが (a b . (unquote x)) を (a b unquote x) (OCaml的には、[a; b; unquote; x])としてしまうため、unquoteがリストの先頭にあるパターンではマッチしなかった。

unquote-splicingがリストの最後の場合、xがリストに評価されなくてもエラーではない。*1

> (define (qq13 x)
  `(foo ,@x))
> (qq13 '(a b c))
(foo a b c)
> (qq13 'a)
(foo . a)

> (define (qq14 x)
  `(,@x))
> (qq14 '(a b c))
(a b c)
> (qq14 'a)
a

これをfixするのに手間取った。

quasiquoteは派生で定義できるようなので、調査するかな。

*1:Racketのドキュメントに記述とサンプルがある http://docs.racket-lang.org/reference/quasiquote.html?q=quasiquote