どうした lenny
今朝、日経ソフトウェアの新刊案内を見ていたら、「魔法の言葉,関数型言語を学ぼう」なんて連載が始まった事を知った。キャッチャーなタイトルだなあ。Haskellかな? と 思ったら、人気のGaucheらしい。どんな展開になるか楽しみだぞ。
そのうちに、「Javaに限界を感じたら、どうすっか Scala」とか、「C#を捨てて、F#はいかが」とかの、シリーズが始まるに違いない。(笑)
バグってたぞ
昨日書いた、循環リストのスクリプト、バグってた。
gosh> (define x (circular-list 1 2 3 4)) x gosh> x #0=(1 2 3 4 . #0#) gosh> (set! x (cdr x)) #0=(2 3 4 1 . #0#) gosh> (set! x (cdr x)) #0=(3 4 1 2 . #0#)
cdrを取ると、先頭に見えてたエレメントが、尻尾(終が無いので、尻尾と言うには おこがましいですが)に移動する。従って、係数もひっくり返しておかないとまずい。 以下は、ちょいと変更した版です。
(use srfi-1) (define *hm* (reverse '(0.50211 0.00778 -0.005602 0.003984 -0.018306))) (define *xn* (circular-list 0 0 0 0 0)) (define (cordec-write v) (format #t "Output: ~s\n" v)) (define (cordec-read) (display "Input: ") (flush) (read)) (define (fir) (let loop ([in 0.0]) (set-car! *xn* in) (set! *xn* (cdr *xn*)) (cordec-write (fold + 0.0 (map * *xn* *hm*))) (loop (cordec-read) )))
折角なので、今回の肝となった、circular-list が、どう実現されてるか、ソースに 当たってみよう。予想では、引数リストの尻尾を見つけて、そのCellのcdrを先頭へと 書き換えているに違いない。
(define (circular-list val1 . vals) (let ((ans (cons val1 vals))) (set-cdr! (last-pair ans) ans) ans))
(define circular-list (lambda lst (let ((lst (list-copy lst))) (begin (set-cdr! (last-pair lst) lst) lst))))
上は、gauche 下は、ypsilon それぞれ個性があって勉強になります。
どうした lenny
数日前に、Debian機を立ち上げたんだけど、pingすら通らなかった。(GWの連休の時も そうだったんだよなぁ)今朝、立ち上げたら、何の問題もなく上がってきた。しかも、apt-get dist-upgradeも出来ちゃった。
一体何があったか、生きているうちに調べておこうと /var/logの下をくまなく探して みたけど、痕跡は一切無し。こりゃ、OSすら上がらない事態になってたと言う事ですかね?
いかれかかっている部品があって、室温の微妙な違いで動かなくなってしまうとかなんですかね? こりゃ、どうしても、症状が出てる時の現場を押える必要があるな。
マーフィー曰く、「壊れていないものは、直せない」 ですから。
LCDをつないでおいて、暑い日に動かしてみよう。(という、ありきたりの結論で、期待した人ごめんなさい、です。)
まてよ、健康チェックぐらいは出来そうだよなぁ。Debian に都合のいいのがある かと思って、 Diag helth reliability 等のキーワードで apt-cache search して みたけど、無いなあ。
後は、ドライヤーか何かで暖めてみるとか、マシンにカツを入れるために、 ハンマーで叩いてみたり、とかやってみるか。やり過ぎは再起不能になって しまうから、手加減しながら!