quasiquote

quote quasiquote unquote unquote-splicing 特にgaucheのquasiquoteの挙動について
0
あはりす @aharisu

`(`(,,@(list 1 2)))の結果がguile,gauche派とmit-scheme,scheme48,pltscheme派で真っ二つなんだが。どうしよう。僕のはどっちにつこうか。

2011-03-31 14:02:18
あはりす @aharisu

scmもguileとgaucheと同じ結果。これで完全に真っ二つになってしまった。本当にどうしよう。

2011-03-31 14:12:12
Shiro Kawai @anohana

@aharisu 外側の`と内側の,@が対応するんですが、それを展開すると(unquote 1 2) が出てきてしまい、これが未定義動作なのが問題なのかな?

2011-03-31 15:28:18
あはりす @aharisu

@anohana そうです。,@を 展開する派としない派があるというはなしです。r5rsの仕様的にはどちらかが正しい動作なのか、そもそも未定義なのか。わかりかねてる所です。

2011-03-31 16:05:38
Shiro Kawai @anohana

@aharisu r5rsのquasiquoteの仕様はそもそも不完全だと思うんですが、Gaucheではこれは未定義と解釈したような気がします。r6rsではunquoteが任意の数の式を取れるため、明確に定義されると思います。

2011-03-31 16:45:10
Shiro Kawai @anohana

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

2011-03-31 16:57:06
あはりす @aharisu

@anohana r6rsのquasiquoteの定義は読んだことがないので読んでみます。情報ありがとうございました。

2011-03-31 17:25:51
ばばろあ @valvallow

ところで、list, quote, quasiquote, unquote, unquote-splicingでは書けて、'`,,@では書けない、という状況はありえるんでしょうか。

2011-05-11 23:44:41
きくちゃん @kikuchan98

gauche,scheme48,sbcl,clispのそれぞれで (let ((a '(1 2 3))) (write ``((,a) (,,@a) (,@,a) (,,a)))) の結果が違う…。特にgaucheで,,@aが期待通り展開されなかったんだけど、何か勘違いしてる??

2011-05-12 01:43:40
でこれき @dico_leque

@valvallow (list 'unquote 'a) みたいな、 quasiquote がらみのは ' ` , ,@ では書けないと思います

2011-05-12 06:37:17
kaki @gengar68

自作処理系に (let ((a '(1 2 3))) (write ``((,a) (,,@ a) (,@,a) (,,a)))) 食わせたらエラー吐いた><

2011-05-12 13:19:19
kaki @gengar68

2重quasiquoteなんて考えたこともなかった.後でR5RSを読もう

2011-05-12 13:23:27
でこれき @dico_leque

RT @kikuchan98: gauche,scheme48,sbcl,clispのそれぞれで (let ((a '(1 2 3))) (write ``((,a) (,,@a) (,@,a) (,,a)))) の結果が違う…。特にgaucheで,,@aが期待通り展開されなかったんだけど、何か勘違いしてる??

2011-05-12 13:34:22
でこれき @dico_leque

確かに Gauche の ,,@ の展開結果が謎。 ypsilon, ikarus は想像通り

2011-05-12 13:40:36
でこれき @dico_leque

ちなみに、 R6RS だと unquote や unquote-splicing に複数の式を渡せるようになっている http://www.r6rs.org/final/html/r6rs/r6rs-Z-H-14.html#node_sec_11.17

2011-05-12 13:47:33
でこれき @dico_leque

compile.scm の pass1-syntax quqsiquote あたりかな

2011-05-12 13:51:43
kaki @gengar68

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

2011-05-12 13:56:48
kaki @gengar68

よく見るとquasiquoteのネストに関してunquote-splicingについてあまり言及されてないように見えるけど,unquoteと同様に扱えばいいんだよね

2011-05-12 14:21:28
でこれき @dico_leque

http://lists.scheme-reports.org/pipermail/scheme-reports/2011-April/000448.html を読むと Common Lisp と Scheme だと入れ子の quasiquote の動作が違うのかな

2011-05-12 14:39:28
enami tsugutomo @_enami

2011 apr 10 以降の gauche なら % ./gosh -ftest gosh> (define a '(a b)) a gosh> ``,,@a `(unquote a b) gosh>

2011-05-12 15:06:51
でこれき @dico_leque

RT @_enami: 2011 apr 10 以降の gauche なら % ./gosh -ftest gosh> (define a '(a b)) a gosh> ``,,@a `(unquote a b) gosh>

2011-05-12 15:17:41
kaki @gengar68

RT @_enami: 2011 apr 10 以降の gauche なら % ./gosh -ftest gosh> (define a '(a b)) a gosh> ``,,@a `(unquote a b) gosh>

2011-05-12 15:20:29
でこれき @dico_leque

unquote を多引き数に拡張して、さらに `(unquote 1 2) を多値を返すようにして——みたいな話。これは…… http://lists.scheme-reports.org/pipermail/scheme-reports/2011-May/000609.html

2011-05-13 01:51:20
でこれき @dico_leque

この unquote の議論あまり理解していない

2011-05-13 01:56:19
kaki @gengar68

チェックが抜けてて `(unquote 1 2) => 1 になってた.パターンマッチがあれば簡潔に書けるだけでなく,この手の漏れも軽減できそう.

2011-05-13 02:17:45