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 でハマってたりするんですが。