Shiro Kawai
shiro****@lava*****
2004年 5月 31日 (月) 19:24:59 JST
From: Katsutoshi Itoh <cut-s****@maste*****> Subject: [Gauche-devel-jp] Would you like to write uniform vector as `#f32(, (+ 1 1) 2)? Date: Sat, 29 May 2004 18:14:26 +0900 > 伊東です。 > ユニフォームベクタについての質問というか要望というか何なんだろう。 > > 通常のベクタでは > > `#(,(+ 1 1) 2) > => #(2 2) > > ってなりますよね? > 同じようにユニフォームベクタも書きたいと思わないものなのでしょうか? なるほど。 仕様的には、R5RSではbackquoteはリストとベクタに関してしか定義されて いませんが、矛盾の無い形で拡張することは可能です。 ただ、そのためにはbackquoteの展開ルーチンがuniform vectorの構文と コンストラクタについて知っている必要があります。コアはuniform vector 無しでも動くのが前提なので、そのへん実装上はちょっとややこしいですね。 > 実は下の様なコードを書いてて、ん〜?こんな風に書かないといけないの? > って思ったのですが、 gauche.uvector だけじゃなく、 srfi-4 でも同じく > こういった書き方は許されてないんですよね。 > ユニフォームベクタって型が一緒のメンバだけで構成されるベクタってだけで > 基本のベクタと同じ扱いだと思ってたんですが、なんか仕様上アタリがあるんでしょうか? > > > ":";exec gosh -b $0 "$@" > (use gauche.uvector) > (use gl) > (use gl.glut) > > (define (initialize) > (gl-clear-color 0.0 0.0 0.0 1.0)) > > (define (display) > (do ((offsetX -1.0 (+ offsetX 1.0))) > ((>= offsetX 100.0) (set! offsetX (- offsetX 100.0))) > (gl-clear GL_COLOR_BUFFER_BIT) > (gl-color '#f32(1.0 1.0 0.0)) > (let ((x (list->f32vector (list (+ -80.0 offsetX) -80.0))) > (y (list->f32vector (list (+ -20.0 offsetX) -20.0)))) > (gl-rect x y)) > ;;; ここの部分をこんな風に書こうとしたのです。最初は。。。 > ;;; (gl-rect `#f32(,(+ -80.0 offsetX) -80.0) `#f32(,(+ -20.0 offsetX) -20.0)) > (gl-flush))) これでどうですか。 (gl-rect (f32vector (+ -80.0 offsetX) -80.0) (f32vector (+ -20.0 offsetX) -20.0)) 拡張型は、こういう形でのコンストラクタがあるのが普通なので、 あまりbackquoteでimplicitにコンストラクタを呼ぶ必要性を 感じないんだと思います。 --shiro