著作一覧 |
素数求めるベンチマークを見ていて、Lispで書いたらどうなるか試そうと思った。手元ですぐ使えるのはelispなので、次のように書いてみた。
(defun primep (n primes) (let ((sq (sqrt n))) (cond ((null primes) t) ((< sq (car primes)) t) ((= (mod n (car primes)) 0) nil) (t (primep n (cdr primes)))))) (defun primes (max) (let ((p '(2)) (n 3)) (while (< n max) (cond ((primep n p) (nconc p (list n)))) (setq n (+ n 1))) (print p))) (benchmark-run 1 (primes 100))
だが、何かおかしい。
(primes 10) (2 3 5 7) (2 3 5 7) ; replのp (primes 10) (2 3 5 7 3 5 7) (2 3 5 7 3 5 7) ; replのp
なんで?
ううむ、「よくある落し穴は、nconcの最後以外の引数に、クォートした定数リストを使うことである。」というのはわかっていたつもりだったが、呼び出しの都度、(2)が新たに作られると考えたのが大間違い。関数内に出現するクォートした定数リストは定数として(再作成したりせずに)扱われるということみたいだ。
システム化を提案する立場の人が、自分自身の業務がシステム化、自動化されていないようでは、紺屋の白袴にもほどがあるんじゃないでしょうか。
おれもそう思う。
なんでだろう?
実証実験にはえらく金(スポンサー)と人手がかかるというのが一つの原因かなぁとか考えてみるのだが、スポンサーには困らないはずなんだよな、というか国(それが可能なスポンサーだろう?)は発注者として、そこまで踏み込んでみたらどうだろうか(でも、失敗した場合の追及され度が現行踏襲よりでかい、失敗を許さないシステムというシステムがあるためにそれが難しいのならば、まずそこからリストラクチャしなければならないのかも、とかも思う)。
ジェズイットを見習え |
関数の中の '(2) を書き換えてしまっているからのようです。<br><br>http://znz.s1.xrea.com/t/?date=20090412#p01
人月だから自動化推進の動機付けが生じないんです。例えばスタロジの自動化技術を買うSIerっていないんですよ。理由が「自動化されると人月が減って売上が下がるから」。これマジ話。ここに工事進行基準(人月前提)が絡むともう…。
>znzさん<br>ありがとうございます。(let ((p (list 2))… がやりたかったことになるのですね。<br>>はぶさん<br>なるほどねぇ。悪循環(悪いこと)なのか、雇用創出(一般的には良いこと)なのか、変なところにはまり込んでしまったみたいですね。