編集可能

quasiquote

quote quasiquote unquote unquote-splicing 特にgaucheのquasiquoteの挙動について
LISP Scheme
0
あはりす @aharisu
`(`(,,@(list 1 2)))の結果がguile,gauche派とmit-scheme,scheme48,pltscheme派で真っ二つなんだが。どうしよう。僕のはどっちにつこうか。
あはりす @aharisu
scmもguileとgaucheと同じ結果。これで完全に真っ二つになってしまった。本当にどうしよう。
Shiro Kawai @anohana
@aharisu 外側の`と内側の,@が対応するんですが、それを展開すると(unquote 1 2) が出てきてしまい、これが未定義動作なのが問題なのかな?
あはりす @aharisu
@anohana そうです。,@を 展開する派としない派があるというはなしです。r5rsの仕様的にはどちらかが正しい動作なのか、そもそも未定義なのか。わかりかねてる所です。
Shiro Kawai @anohana
@aharisu r5rsのquasiquoteの仕様はそもそも不完全だと思うんですが、Gaucheではこれは未定義と解釈したような気がします。r6rsではunquoteが任意の数の式を取れるため、明確に定義されると思います。
Shiro Kawai @anohana
@aharisu 今から実装するならr6rs互換にしておくのが良いのでは。
あはりす @aharisu
@anohana r6rsのquasiquoteの定義は読んだことがないので読んでみます。情報ありがとうございました。
垂金権造 @valvallow
ところで、list, quote, quasiquote, unquote, unquote-splicingでは書けて、'`,,@では書けない、という状況はありえるんでしょうか。
きくちゃん @kikuchan98
gauche,scheme48,sbcl,clispのそれぞれで (let ((a '(1 2 3))) (write ``((,a) (,,@a) (,@,a) (,,a)))) の結果が違う…。特にgaucheで,,@aが期待通り展開されなかったんだけど、何か勘違いしてる??
でこれき @dico_leque
@valvallow (list 'unquote 'a) みたいな、 quasiquote がらみのは ' ` , ,@ では書けないと思います
kaki @gengar68
自作処理系に (let ((a '(1 2 3))) (write ``((,a) (,,@ a) (,@,a) (,,a)))) 食わせたらエラー吐いた><
kaki @gengar68
2重quasiquoteなんて考えたこともなかった.後でR5RSを読もう
でこれき @dico_leque
RT @kikuchan98: gauche,scheme48,sbcl,clispのそれぞれで (let ((a '(1 2 3))) (write ``((,a) (,,@a) (,@,a) (,,a)))) の結果が違う…。特にgaucheで,,@aが期待通り展開されなかったんだけど、何か勘違いしてる??
でこれき @dico_leque
確かに Gauche の ,,@ の展開結果が謎。 ypsilon, ikarus は想像通り
でこれき @dico_leque
ちなみに、 R6RS だと unquote や unquote-splicing に複数の式を渡せるようになっている http://www.r6rs.org/final/html/r6rs/r6rs-Z-H-14.html#node_sec_11.17
でこれき @dico_leque
compile.scm の pass1-syntax quqsiquote あたりかな
kaki @gengar68
R5RSに普通に書いてあった. "準引用形式は入れ子にしてもよい。置換は,最外のバッククォートと同じ入れ子レベルで現れる被 unquote 要素に対してだけ行われる。入れ子レベルは,準引用に入って行くたびに1だけ増え,unquote される要素に入って行くたびに 1だけ減る。"
kaki @gengar68
よく見るとquasiquoteのネストに関してunquote-splicingについてあまり言及されてないように見えるけど,unquoteと同様に扱えばいいんだよね
でこれき @dico_leque
http://lists.scheme-reports.org/pipermail/scheme-reports/2011-April/000448.html を読むと Common Lisp と Scheme だと入れ子の quasiquote の動作が違うのかな
enami tsugutomo @_enami
2011 apr 10 以降の gauche なら % ./gosh -ftest gosh> (define a '(a b)) a gosh> ``,,@a `(unquote a b) gosh>
でこれき @dico_leque
RT @_enami: 2011 apr 10 以降の gauche なら % ./gosh -ftest gosh> (define a '(a b)) a gosh> ``,,@a `(unquote a b) gosh>
kaki @gengar68
RT @_enami: 2011 apr 10 以降の gauche なら % ./gosh -ftest gosh> (define a '(a b)) a gosh> ``,,@a `(unquote a b) gosh>
でこれき @dico_leque
unquote を多引き数に拡張して、さらに `(unquote 1 2) を多値を返すようにして——みたいな話。これは…… http://lists.scheme-reports.org/pipermail/scheme-reports/2011-May/000609.html
でこれき @dico_leque
この unquote の議論あまり理解していない
kaki @gengar68
チェックが抜けてて `(unquote 1 2) => 1 になってた.パターンマッチがあれば簡潔に書けるだけでなく,この手の漏れも軽減できそう.
残りを読む(22)

コメント

垂金権造 @valvallow 2011年5月13日
いくつか追加しました
垂金権造 @valvallow 2011年5月13日
新しいツイートと、教えてもらった少し古いツイートを追加しました。 (みなさん勝手にトゥギャってすいません。。誰でも編集可なので後はよろしくお願いします。)
kaki @gengar68 2011年5月13日
関係ないtweetを削除したら逆に目立ってしまった…?togetterの勝手がよくわからない.大目に見てやって下さい.
ログインして広告を非表示にする
ログインして広告を非表示にする