おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

lisp入門その3

その3。少しずつわかってきた気がするけどまだ先長い。

制御構造

cond
if ~ else if ~ else if ~と同じ。
zerop
引数がゼロかどうかをチェックし、ゼロならtを返す。
サンプル
(defun how-many (count)
  (cond ((zerop count) "no")
	((= count 1) "one")
	((= count 2) "two")	
	(t "many")))
(how-many 1)
"one"
(how-many 2)
"two"
(how-many 5)
"many"

リスト

  • スタックのような概念らしい。
  • リストはヘッドとテールの2つの部分からなるデータ構造。
  • ヘッドは「リストの先頭」テールは「リストの残り」という意味。ヘッドを取得するにはcar関数、テールを取得するにはcdr関数を使う。

リストを作るには、cons関数にヘッドとテールを渡すか、listに複数の要素を渡してやるとよいらしい。こんな感じ。

(cons head tail)
(list 2 3 4 5)
(cons 1 list(2 3 4 5))

一番下の行にcarすると1, cdrすると(2 3 4 5)が返ってくる。

複文

progn

複数の文で構成されるブロックを、1個の文のように見せかける手段。

(progn statement-block)
let

変数定義とstatement-blockの実行をする。変数の定義の仕方は下記のように複数
定義されなかった変数はnilになる。

(let (var1 var2 ...)
  statement-block)
(let ((var1 value1) (var2 value2) ...)
  statement-block)
(let (var1 (var2 value2) var3 ...)
  statement-block)

変数に代入が行われるのはstatement-blockの実行が終わってから。先に変数の代入が行われるようにするにはletの代わりにlet*を使う。