(top)  (memo)  (rss)
著名な Lisper である Joe Marshall 氏の Wiki で見かけた記事の翻訳です。 (http://code.google.com/p/jrm-code-project/wiki/ProgrammingArt )
プログラムは芸術である。
このホームページでは、私はプログラムが芸術品であるとはっきり宣言する。
多くの人が、芸術とプログラミングの間に関連性を見い出してきた。私は比喩的な意味ではなく、文学と関連があると信じている。
プログラムの構造と解釈 (Structure and Interpretation of Computer Programs) では例題の 1.3 でユーザーに次のように 問うている。
三つの数字を引数として取り、大きいほうから二つの数字をそれぞれ平方した和を合計したものを返す関数を定義せよ。
この例題の意図しているポイントは cond オペレータを用いた場合分けの導入である。 期待されている解答はこのようなものだろう。
(define (sum-square-largest x y z)
(cond ((and (> y x) (> z x)) ;; y and z are largest
(+ (* y y) (* z z)))
((and (> x y) (> z y)) ;; x and z are largest
(+ (* x x) (* z z)))
((and (> x z) (> y z)) ;; x and y are largest
(+ (* x x) (* y y)))))
もちろん、この解答には何種類かのバリエーションがあるだろう。 しかし、重要な点は、x, y, z の中の最も小さな数を判定する三通りの条件分岐である。 問題中の対象性は、解答の中の対称性と対応している。
では、この解答をみてほしい:
(define (sum-square-largest x y z)
(cond ((and (< x y) (< x z)) ;; x is smallest
(+ (* y y) (* z z)))
(else (sum-square-largest y z x))))
同僚にはじめてこの解答を見せたときの反応は、一種の驚きを含んだ笑いだった。 この解答は動作に必要な部品 多重分岐 を備えていないように見えるが、 しかしちゃんと動作する。 だれもがこの例題が多重分岐を教えるためのものだと知っており、再帰呼び出しが ここで登場する事を予想していなかったために、この短い解答が思いがけないものに 感じられたのだと思う。
posted: 2007/04/11 22:16 | permanent link to this entry | Tags: LISP