SICP 読み (23)

2.2.3 節に入り、面白いのですがハードル高い。プログラミングにおける抽象化とゆーナニがどうなのか、という事を考えざる得ない課題というか記述が多くて。
そういえば 4 年位まえにここで書かれている

  • enumerate
  • filter
  • accumuate

というソレを題材に若い方々にレクチャを施した覚えあり。

問題 2.33

机上にて検討して別途マシン確認。この程度であれば紙の上で何とか、なソレになってるようなので嬉しいがハードルは先にも無数にある。

(define (accumulate op init seq)
  (if (null? seq)
      init
      (op (car seq)
	  (accumulate op init (cdr seq)))))

(define (map p seq)
  (accumulate (lambda (x y) (cons (p x) y)) '() seq))

(define (append seq1 seq2)
  (accumulate cons seq2 seq1))

(define (length seq)
  (accumulate (lambda (x y) (+ 1 y)) 0 seq))

メモには「map は p したのを cons する」と書いてある。日本の lisp を作ったエラい人は紙で、なナニだったらしいんですが、ここまでやってきた時点で机上の検討が大切だよね、という事を再認識しておる次第ッス。

問題 2.34

これは机上検証のみ。というか、これこそ試験ドリブンでやるべき課題なんだろうか。

以下に書いてある事をサンプルな問題にあてはめてみる。

1 + 3x + 5x^3 + x^5

1 + x(3 + 0x + 5x ^2 + 0x ^ 3 + x^4)

1 + x(3 + x(0 + 5x + 0x ^2 + x ^ 3))

1 + x(3 + x(0 + x(5 + 0x + x ^ 2)))

1 + x(3 + x(0 + x(5 + x(0 + x))))

1 + x(3 + x(0 + x(5 + x(0 + x(1)))))

これは、括弧の中が cdr だな。こんな感じで OK なんでしょうか。

(define (horner-eval x coefficient-sequence)
  (accumulate (lambda (this-coeff higher-terms)
		(+ this-coeff (* x higher-terms)))
	      0
	      coefficient-sequence))

一応動作は確認してるんですが、なかなか面白い。
と、言いつつ 2.35 でハマってたりするんですが。