todo

ネットでちょくちょくtodoと名乗っています. 本性は金谷@梅村研です.

http://www.ss.ics.tut.ac.jp/kanaya/

todo:log


(2003/09/17 08:47:02 PDT): Gaucheのページのタイトルとバナーの語が実は一語違っていたりして, どっちを参考文献にすべきか困っています(本当?) 今のlatexフォーマットだと,Interpreterでなければ段組みからはみ出てしまったりするので タイトルのInterpreterを採用していますけど.

(2003/09/08 06:51:01 PDT) Gauche 7.1には下に書いた(書いてもらった)6/12のhash.cに対するパッチが 当たっていなかったのですが,Shiroさん版でも何か問題がありましたか? 問題なさそうであればパッチを適用していただけるとありがたいのですが,いかがでしょう.

(2003/07/12 00:29:16 PDT)suffix.scmのリンク先が古かった….

(2003/06/17 10:54:45 PDT)まだ思いついただけで何も手を動かしていないのですが, gauche.testに小数点用のテストも追加したいなぁと.JUnitで言うところのコレ. 誤差がdelta以内であればテストに合格という方針. どのように修正するのが一番スマートかなぁと考え中.

 public static void assertEquals(double expected,
                                 double actual,
                                 double delta)
  (test* "test-procedure" 
         3.14                ;; expected
         (test-procedure)    ;; actual
         (lambda (a b) (< (abs (- a b)) delta))  ;; equality pred

なるほど,&optional compareのところに比較関数を自分で書けば良いですね. 金谷はこのようなものをイメージしていました. gauche.testの一部に手を加えたわけですが,ラッパ手続きかマクロを使えば内部を変更しなくても良?辰燭里?癲

 (define (prim-test msg expect thunk . compare)
   (let ((cmp (if (pair? compare)
               (let1 ca (car compare)
                 (if (number? ca)  ;数値であれば比較手続きを返す
                   (lambda (a b)
                     (<= (abs (- a b))
                         ca))
                   ca))
               equal?)))

&optional compareが数字であればShiroさんの例のequality pred手続きを返す. これだと引数の与え方がJUnitに近くなったかな.

 gosh> (test "nazo" 5.25 (lambda () 5.5) 0.3)
 test nazo, expects 5.25 ==> ok
 gosh> (test "nazo" 5.25 (lambda () 5.5) 0.2)
 test nazo, expects 5.25 ==> ERROR: GOT 5.5

Shiro: 私の好みでは、test本体には変更を加えず、 むしろこんな感じのを定義しておいて:

 (define (nearly= d) (lambda (a b) (< (abs (- a b)) d)))

こういうふうに呼び出すのがいいです:

 (test "nazo" 5.25 (lambda () 5.5) (nearly= 0.3))

さらにnearly=をいちいち書くのが面倒になったらマクロでラップすると。


(2003/06/12 11:44:58 PDT)一応つたない変更をhash.cに加えてみました. 下の方でやっていた,クラスを評価したときの文字列をキーとする方法です. とりあえずこの程度で自分の要望は足りるのですが, この修正部分に入る前に,クラスかどうかを判定する述語を入れて, それ以外の変なデータ(何があるだろ?)が来たときの対策を付ける必要があると思います. クラスかどうかを判定する述語って何ですか?

 --- hash.c~     2003-06-13 03:25:32.000000000 +0900
 +++ hash.c      2003-06-13 03:26:57.000000000 +0900
 @@ -349,8 +349,9 @@
          return string_hash(SCM_OBJ(SCM_KEYWORD_NAME(obj)));
      } else {
          /* TODO: allow to define per-object hash function */
 -        Scm_Error("object not hashable: %S", obj);
 -        return 0;               /* dummy */
 +        return string_hash(SCM_OBJ(SCM_CLASS(obj)->name));
      }
  }
    } else if (SCM_ISA(obj, SCM_CLASS_CLASS) && 
               SCM_SYMBOLP(SCM_CLASS(obj)->name)) {
        return string_hash(SCM_SYMBOL_NAME(SCM_CLASS(obj)->name));
    } else {
        Scm_Error("object not hashable: %S", obj);
        return 0; /* dummy */
    }

(2003/06/11 00:18:16 PDT) suffix.scmの結果をキャッシュするお話で bbsにツッコミがあったことについ先ほど気付きました. インスタンスはハッシュのキーにできますが,比較方法がeq?しかない,という意味です.

まず,結果をキャッシュしたい手続きには,本来eq?で比較すべき(self <suffix>)と, string=?やequal?で比較しなければならないkeywordが混在しています. keywordはコーパス中の文字列と比較するため,eq?では比較できません (試しにeq?にしたところキャッシュにヒットしなくなりました).

 (define-method suffix-df ((self <suffix>) keyword)
 (define-method suffix-tf-memo ((self <suffix>) keyword document-number)

それで(self <suffix>)もkeywordも比較方法をequal?にし,クラス<suffix>に対して object-equal?も定義したのですが, Gauche-0.7/src/hash.c のgeneral_hash() 350行目には,

    } else {
        /* TODO: allow to define per-object hash function */
        Scm_Error("object not hashable: %S", obj);

とのことでobject-equal?を定義するだけではハッシュ関数の計算を行ってくれないそうです. そのときはソースを修正する時間もなかったため, インスタンスを評価した結果を文字列とし,(self <suffix>)もkeywordも equal?比較できるようにしてみたわけです.


(2003/06/08 00:16:19 PDT) そういえば,研究室にOpteron(Mem8GB)+Turbo8 for AMD64が2台来たんだった. 使えるようになったら,Gaucheがちゃんとコンパイル出来るかテストしてみますね. 初代Itanium+RH7のときは問題なかったので,まぁ多分今回も問題ない…といいなぁ.

(2003/06/06 10:48:12 PDT) suffix.scmをv1.2にしてみた. いい加減usageもかこうかな.

More ...