関数型言語の勉強にSICPを読もう - (35) 3章 - 小休止 外の世界とつながろうファイルを読む

#scheme-jp(wide系 IRCチャンネル)でのネタふりで、ファイルの読み込みを学んでみました。
Schemeは port を介して入出力するようです。
面白いのが read の戻り値がS式だということです。(これはひらっちさんから教えてもらいました。)
なのでファイルの中身がS式だといろいろと面白いことが出来そうなので作ってみました。


まず data.scm を用意します。

(list 1 2 3 4 5 6 7 8 9)
(list 1 1 1 1 1 1 1 1 1)


次はプログラム本体です。
data.scmを読み込んで、read した S式のlistの要素を sum して表示します。

(define (sum l)
  (if (null? l)
      0
      (+ (car l) (sum (cdr l)))))

(call-with-input-file "data.scm"
  (lambda (i)
    (define (f)
      (let ((l (read i)))
        (if (eof-object? l) #f
            (begin (display (sum (eval l '()))) (f))))) (f)))

これをやると 45 と 9 が表示されます。
read で読み込んだデータを eval してsumに渡しています。


で、思ったのですが

(1 2 3 4 5 6 7 8 9)
(1 1 1 1 1 1 1 1 1)

として、evalしないほうが自然ですね。
ひらっちさんの説明で、S式ってのはJSONみたいなもんですよってのが分かりやすくて面白かったです。


※「SICPを読もう」の目次はこちら


計算機プログラムの構造と解釈
Gerald Jay Sussman Julie Sussman Harold Abelson 和田 英一
ピアソンエデュケーション (2000/02)
売り上げランキング: 56,404