ytaki

STkからGaucheに乗り換えました. 日本語記述を扱いやすいので重宝してます.

Web: http://nbk.bz/ , email: y@nbk.bz

Schemeでアルゴリズム

過去:ytaki:200503-04



KiloへのGauche組み込み

($date)

15年以上ぶりのWiLiKi更新…マジか.

現在,KiloにいろんなLISP処理系(Gaucheの他にはGNU Guile,Chibi-Scheme,ECL)を組み込んで遊んでいます.概要はこちらのTwitter投稿から.

https://twitter.com/ytaki0801/status/1377852782389043200

Gaucheについては,Scm_EvalCStringが未定義でも値を返してくれるのと,write-to-string/SCM_BIND_PROCのScm_ApplyRec1とその戻り値のSCM_STRING_BODY_START/SCM_STRING_BODY変換のおかげで,eval-last-sexp相当(と括弧対応)が割といい感じに使えてます.なお,実際に組み込んでいるコードは,チュートリアルサイトのStep 130を用いています.

Kilo自体がUTF-8未対応ということもあって,readline代わりの学習用くらいしか用途がなさそうですが,需要があればGauche-kilo(Kilo-gauche?)みたいに独立してGutHubとかに上げることも考えてます.いや,他の処理系については対応があまり進んでないのと,今の複数処理系対応コードだとライセンス管理が酷いことになりそうというか….


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 布教用(?)に最適かも.

More ...