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も同じように解釈せよとうことかしらん。