SICP読書会いってきますた

20時集まり予定だったんだけどいきなり遅刻。
浜町についてid:itkzに電話して合流。
id:itkzが近くにあった神社のお供え物*1を盗もうとしていたのでとりあえずツッこむ。

油揚げマジうまい。*2

ドワンゴの中に入ると、会議室らしきところでもう一人Aさんがいた。
簡単に自己紹介して早速PCのセットアップ。
自宅のサーバーに接続してLISP関係のプログラムを探していると、Aさんから「Gaucheがイイヨ」って勧められるのでとりあえず入れてみる。

kasuya@proc:~$ aptitude install Gauche
kasuya@proc:~$ gosh
gosh>

楽をするために、vimスクリプトを少し書く

" for gosh
fun! RunGosh()
  let resultfile = '~/tmp/vim/gosh-eval-test.txt'
  set noswapfile
  w
  silent exe '!gosh '.expand("%").'> '.resultfile
  silent exe 'pedit '.resultfile
  set swapfile
endfun

nmap <leader>t :call RunGosh()<cr>

これで t で実行して、結果をプレビューウィンドウで表示されるぞー。

準備が終わったのでようやくSICPの問題を解き始める。

itkzとAさんから、「先週は、問題1.3をエレガントに書くにはどうしたらいいか、ということをずっと話したりしていた」ということを聞いていたので、俺も負けじと問題1.3に手をつけてみる。

問題本文
三つの数を引数としてとり、大きい2つの数の二条の和を返す手続きを定義せよ

んで、つくってみたのが、これ。

(define (main args)


; (max-two-square 1 2 3)
; (max-two-square 4 5 6)
  (print (max-two-square 8 9 7))
)


(define (max-two-square x y z)
  (define (max a b)
    ( if(< a b) b
      a
    )
  )
  (define (mid a b c)
    (define (min a b)
      ( if(< a b) a
        b
      )
    )
    (- (+ a b c)
       (max a (max b c))
       (min a (min b c))
    )
  )

  (define (square x)
    (* x x)
  )

  (+ (square (max x (max y z)))
     (square (mid x y z)))
)

maxとminは簡単に取れるんだけど、上位2つの値がとれないため、x y z の値を全部足して、最大値、最小値を引くことにして、 mid というのを定義した。
あとは、max と mid を2乗して終わり。効率とか考えていないけど、まあいいや。
なんとなくだけど、効率よりステキな書き方を考えたほうがいいのかなぁ、と思ってみたりする。

んで、終電を逃してしまいそうになり、解散。

id:itkzとAさん、昨日はありがとうございました。
また誘ってください。

計算機プログラムの構造と解釈

計算機プログラムの構造と解釈

*1:油揚げ

*2:うそだけど