トップ «前の日記(2009-04-11) 最新 次の日記(2009-04-13)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2009-04-12

_ 教えてelisp

素数求めるベンチマークを見ていて、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

なんで?

追記:答: '(2)を書き換えているから

ううむ、「よくある落し穴は、nconcの最後以外の引数に、クォートした定数リストを使うことである。」というのはわかっていたつもりだったが、呼び出しの都度、(2)が新たに作られると考えたのが大間違い。関数内に出現するクォートした定数リストは定数として(再作成したりせずに)扱われるということみたいだ。

_ 青は藍より出でて

システム化を提案する立場の人が、自分自身の業務がシステム化、自動化されていないようでは、紺屋の白袴にもほどがあるんじゃないでしょうか。

『ずっと受けたかったソフトウェアエンジニアリングの新人研修』続き

おれもそう思う。

なんでだろう?

実証実験にはえらく金(スポンサー)と人手がかかるというのが一つの原因かなぁとか考えてみるのだが、スポンサーには困らないはずなんだよな、というか国(それが可能なスポンサーだろう?)は発注者として、そこまで踏み込んでみたらどうだろうか(でも、失敗した場合の追及され度が現行踏襲よりでかい、失敗を許さないシステムというシステムがあるためにそれが難しいのならば、まずそこからリストラクチャしなければならないのかも、とかも思う)。

本日のツッコミ(全3件) [ツッコミを入れる]
_ znz (2009-04-12 12:19)

関数の中の '(2) を書き換えてしまっているからのようです。<br><br>http://znz.s1.xrea.com/t/?date=20090412#p01

_ はぶあきひろ (2009-04-12 12:47)

人月だから自動化推進の動機付けが生じないんです。例えばスタロジの自動化技術を買うSIerっていないんですよ。理由が「自動化されると人月が減って売上が下がるから」。これマジ話。ここに工事進行基準(人月前提)が絡むともう…。

_ arton (2009-04-12 16:36)

>znzさん<br>ありがとうございます。(let ((p (list 2))… がやりたかったことになるのですね。<br>>はぶさん<br>なるほどねぇ。悪循環(悪いこと)なのか、雇用創出(一般的には良いこと)なのか、変なところにはまり込んでしまったみたいですね。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|

ジェズイットを見習え