ytaki


(2005/03/19 00:25:46 PST)

仕事関連で STk を使っていたのですが,最近 Gauche に乗り換えました. 日本語記述を扱いやすいので重宝してます.メタオブジェクトプロトコル勉強中.

Web: http://www.nightbreak.org/ , email: you@nightbreak.org

過去:ytaki:200503-04

進行中: 『Scheme でアルゴリズム



NetBSD/macppc での Gauche 0.8.4 ビルドの不具合

(2005/06/25 19:51:47 PDT)

メーリングリストに詳細を投げようかと思ったけど,対象がかなり ピンポイントな気がするのでここにさりげなく書いておく(をい).

Gauche:NetBSDにも書きましたが,NetBSD/macppc 2.0.2 で Gauche 0.8.4 を make すると,メモリ不足で compile.c のコンパイルが コケました.詳細は以下の NetBSD のメーリングリストのメールを参照.

http://www.jp.netbsd.org/ja/JP/ml/port-powerpc-ja/200506/msg00003.html

http://www.jp.netbsd.org/ja/JP/ml/port-powerpc-ja/200506/msg00005.html

メモリ 256 MB のまま使おうとする時点で無謀なのかもだけどorz. MacOS X (10.3 Panther)でも compile.c のコンパイルがいつまで経っても 終わらず ^C で止めちゃいました(^^;).

とりあえず上記メールにもあるように,-O2 で行われる最適化の一部をはずせば その他は特に問題なく,make check も全て通ってます.これは,0.8.4 を 入れた後に現在の CVS 版をビルドしても同様でした.なお,上記で gencomp に 言及してますが明確な根拠はありません(ダメじゃん).

srfi-42

(2005/06/07 01:33:02 PDT)

Gauche 0.8.4 にsrfi-42が 入っていたので,早速以前書いた内包表記を試してみました.

gosh> (use srfi-42)
#<undef>
gosh> (list-ec (: x 5) (if (even? x)) (: y 5) (if (odd? y)) (list x y))
((0 1) (0 3) (2 1) (2 3) (4 1) (4 3))
gosh> (string-ec (: x "今日は良い天気でした") (if (char<=? #?亜 x)) x)
"今日良天気"

良かった,合ってた(をい).

10進数<->2進数の小数表現対応

(2005/05/25 04:33:39 PDT)

とある理由で適当に作ったのですが,書き捨てはちょっともったいない 気がしたのでここに貼り付け.

(define (string->number-bindecimal str)
  (define (decimal dlist n)
    (if (null? dlist)
        0
        (+ (decimal (cdr dlist) (/ n 2))
           (if (equal? (car dlist) #?1) n 0))))
  (let ((pnum (string-scan str ".")))
    (if pnum
        (let ((istr (substring str 0 pnum))
              (dstr (substring str (+ pnum 1) (string-length str))))
          (+ (string->number istr 2) (decimal (string->list dstr) 0.5)))
        (string->number str 2))))

(define (number->string-bindecimal num)
  (define (decimal dnum ret)
    (if (or (= dnum 0) (> (string-length ret) 10)) ;; 10桁未満固定
        ret
        (let* ((r (* dnum 2))
               (x (if (>= r 1) (- r 1) r))
               (c (if (>= r 1) "1" "0")))
          (decimal x (string-append ret c)))))
  (let* ((inum (inexact->exact (truncate num)))
         (dnum (- num inum)))
    (string-append (number->string inum 2)
                   (if (zero? dnum) "" (decimal dnum ".")))))


(string->number-bindecimal "1111.01")
=> 15.25
(string->number-bindecimal "1111.111")
=> 15.875
(number->string-bindecimal 1024.125)
=> "10000000000.001"
(number->string-bindecimal 0.625)
=> "0.101"
(string->number-bindecimal (number->string-bindecimal 123.456))
=> 123.455078125

n進数化は難しくないと思うけど,需要なさそうだしなあ(苦笑).

Pocket Scheme

(2005/05/09 19:55:55 PDT)

他の処理系の話ですが(^^;),本来の Windows CE 版だけでなく Windows NT/2000 版がある上に,Unicode にも対応していることを 最近知りました(正規表現は 8 ビットキャラクタ限定みたいですが). 簡易エディタもついていて,Scheme 布教用(?)に最適かも.


Last modified : 2005/07/25 09:52:14 UTC