Common Lisp

ダイナミックスコープ

関数で定義した局所変数に、ほかの関数からアクセスできる場合がある。 (defun foo () (let ((a "Hello")) (print a) (bar))) (defun bar () (print a)) (setq a "world") (bar) ;; => "world" (foo) ;; => "Hello" "Hello" (Emacs Lisp の場合) "world" (Co…

シェルピンスキーのギャスケット

Wikipedia パスカルの三角形の記述に「パスカルの三角形の奇数のみを塗りつぶすと、シェルピンスキーのギャスケットの一部分が出現する」と言う説明がある。 ;; x から max までのリストを作って返す。 ;; (mk-list 1 10) ;=> (1 2 3 4 5 6 7 8 9 10) (defun…

Common Lisp でフィボナッチ数列(末尾再帰)

フィボナッチ数列を末尾再帰で求める。 (defun mk-list (x max) (if (= x max) (list max) (cons x (mk-list (+ x 1) max)))) ;; 二重再帰 (defun fib (x) (cond ((= x 1) 1) ((= x 2) 1) (t (+ (fib (- x 1))(fib (- x 2)))))) (mapcar #'fib (mk-list 1 10…

Common Lisp でハノイの塔を解いてみる。

再帰を使うと美しく簡潔に解けることで有名な『ハノイの塔』を Common Lisp で塔の状態を表示しながら解いてみます。 ;; 三つある塔それぞれを表現します。 ;; 三つの塔を作ります。 ;; 塔"A"の重ねてあるリングを塔"B"に移動したい。 (setq tower-a '("A" (…

Common Lisp でエラトステネスの篩

Common Lisp でエラトステネスの篩をやってみてハマったところ。 make-list という関数は定義できません。 null? がないので atom を使った。 余りを求める関数は mod 。 ;; x から max までのリストを作って返す。 ;; (mk-list 1 10) ;=> (1 2 3 4 5 6 7 8 …

SBCL(Steel Bank Common Lisp)でコンパイルしてみる。

WIndowsからLispでCOMを使いたい思い調べましたところ、Steel Bank Common Lispが良さそうなのでインストールしてみました。 SBCLについては紫藤のWiki:SBCL(Steel Bank Common Lisp)に詳しい紹介があります。LISP で win32ole を使いたい訳です。 Common Li…