フリーソフトの小道   

コンピュータ・プログラマー養成講座(入門編)

第15回 「LISP入門」
〜 プログラミングコンテスト「素数発見」の応募作品から 〜

LISPとは

 コンピュータのプログラミング言語で古くから使われているものとして、科学技術計算向けの高級言語 「FORTRAN」、 商用計算向けの 「COBOL」 があります。それに並ぶほど歴史を持つ(文字列処理などを扱う)リスト処理向けの高級言語「LISP」があります。 今回プログラミングコンテスト「素数発見」に応募のプログラムは最後にある 「LISP」 で書かれたものです。 LISP言語では、現在でも幅広く使われている common lisp ですが、UNIXの有名なエディタ emacs のマクロ言語としても有名です。 インターネットサイトでは、千葉大学のサイトに分かりやすい 解説のページ があります。

 LISPは Windows にも移植されており、利用可能です。詳しくは 日本LISPユーザー会 のページをご覧ください。 コンパイラなどいろいろな情報がリンクされています。フリーソフトのものもあれば、商用のものもあります。勉強するにはお金は不要、意欲だけでOKですよ。

 今回の応募作品のプログラムリストを見て分かるように、不思議なプログラムの姿です。カッコがやたらに多いことに気付くと思いますが。 プログラムのブロックを表す記号と考えてよいものです。 筆者(志)は本格的にはLISPを勉強したことはありません。入門書を1冊読破して簡単なプログラムが書ける程度までの勉強をした程度です。

理数コースの先輩の作品です

 作者は神戸高校の理数コースの先輩です。彼は既に社会に出て、ある企業で研究をしている現役です。


  ;Find Prime Numbers

  ;コンパイル時のオプション
  (declaim (optimize (speed 3)
		   (compilation-speed 0)
		   (safety 0)
		   (debug 0)))

  ;数 n が素数なら t をそうでなければ nil を返す  ※ t は真、nil は偽 を示す
  ;引数は n と n の平方根以上の整数と n より小さい素数のリスト
  (defun primenumberp (n sqrtn prime-number-list)
    (let ((m (pop prime-number-list)))
      (if (< sqrtn m)
	    t
        (if (integerp (/ n m))      
	    nil
	  (primenumberp n sqrtn prime-number-list)))))

  ;数 n から end までの間にある素数のリストを返す
  ;アルゴリズムの関係上、最初にいくつか素数のリストを
  ;渡してやらなければならない
  ;引数は n,end, 素数のリスト

  (defun show-prime-numbers (n end prime-number-list)
    (if (> n end)
        prime-number-list
        (if (primenumberp n (ceiling (sqrt n)) prime-number-list)
	    (show-prime-numbers (+ n 2) end (nconc prime-number-list (list n)))
	    (show-prime-numbers (+ n 2) end prime-number-list))))

  ;引数のリストを result.txt というファイルに保存する
  (defun save-list (list)
    (setf path (make-pathname :name "result.txt"))
    (with-open-file (str path :direction :output :if-exists :supersede)
      (format str "~A~%" list)))

  ;(compile 'primenumberp)
  ;(compile 'show-prime-numbers)
  ;(compile 'save-list)

  (time (save-list (show-prime-numbers 7 1000000 '(2 3 5))))


本日はこれくらいに

 プログラムの中の演算部分について、現在主流の言語と異なる表記について一言。 (+ 5 3) と書けば、5+3 のことを示し、結果は 8 となる。少し変な感じがしますが、慣れれば分かりやすい表記方法です。 (+ n 2) は n+2、(/ n m) は n÷m などです。 ソースリスト全てを理解するのは無理だから、これくらいにしましょう。 コンピュータの言語としてはマイナーですが、根強いファンがいる言語です。この言語に良く似たものが FORTH という言語があります。 C/C++ や JAVA もいいのですが、このような古典言語も良いものです。

2005/05/08  管理人(志)



感想・意見は、掲示板、または メールでどうぞ! --- 管理人(志)