quasiquote続き
やはりテストケースに漏れがあった。ネストとdotted list表記の組み合わせでおかしな結果になっていた。
(define (qq7-6 name1) `(a b . `,,name1)) (qq7-6 'x) => (a b a b quasiquote ,x)
では期待結果はなにか、ということで調べてみると、微妙なことになっている。
Gauche gosh> `(a b . `,,'x) *** ERROR: Compile Error: unquote appeared outside quasiquote: ,'x Racket > `(a b . `,,'x) (a b quasiquote ,x)
果たして外なのか、内なのか。
これは
(quasiquote (a b quasiquote (unquote (unquote (quote x)))))
なので、2番目のリストの先頭ではないquasiquoteをどう解釈するか、ネストレベルを増やすか、そのままかの違いだと思われる。
unquoteについては、リストの先頭でないunquoteもリストの先頭のunquoteと同様に機能して、ネストレベルが減少するようである。R7RSではサンプルで
`((foo ,(- 10 3)) ,@(cdr '(c)) . ,(car '(cons))) => ((foo 7) . cons)
と記述している。quasiquoteも同じように解釈せよとうことかしらん。