##CLのbackquoteはリーダが解釈するので、例えば `#u8(0 ,(+ 1 2)) を (u8vector 0 (+ 1 2)) と読む、なんてことが可能なんですが、Schemeのquasiquote/unquoteはそれぞれ (quasiquote ...) (unquote ...) というS式にならなければならないので、 `#u8(0 ,(+ 1 2)) は (quasiquote #u8(0 (unquote (+ 1 2))) というS式にならなければならない、でも #u8 の中に (unquote (+ 1 2)) という一般のS式を持つことはできない、というジレンマがあります。
#なるほど。そういう事情があるのですね。今のGaucheだと何事も無かったかのように0が入ってしまうので、#u8の中に数字じゃない物がきたら、エラーになった方が嬉しいです。
#(use gauche.uvector)
(define a 1)
(define x #u8(a))
(define y #f32(a))
#こうしたときに、#u8の方はエラーになるのですが、#f32の方は何事も無く0.0が入ってしまいます。これは意図した動作でしょうか?
#そんなふうに書く人いないだろ、と思ってreaderがサボってる可能性大。
#ああ、もっと深いところだった。Scm_GetDoubleがイリーガルなオブジェクトの時に0.0を返してるせいだな。これはエラーチェック厳密版を作った方がいいかな。
#uvectorのquasiquoteについて少し考えてみたんだけど、そもそもquasiquoteが力を発揮するのってネストした構造の奥の方がちょっと変わって欲しい場合とか成分の多くがクオートの必要な構造の場合なんだな。`(a b (c ,x)) vs (list 'a 'b (list 'c x)) とか。ところがuniform vectorはその中に別の構造がネストすることもないし、成分は数値なのでリテラルでもクオートは不要、というわけで `#u8(1 2 ,(+ x y)) と書きたければ (u8vector 1 2 (+ x y)) と書けばいいじゃない、という結論に達した。