どうした 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 して みたけど、無いなあ。

後は、ドライヤーか何かで暖めてみるとか、マシンにカツを入れるために、 ハンマーで叩いてみたり、とかやってみるか。やり過ぎは再起不能になって しまうから、手加減しながら!