見てるページ
Lisp入門
#基本演算
>(+ 10 20)
30
#代入
>(setq x 10)
10
#特別式
setq
は言語仕様上は関数ではなく 特別式 と呼ばれる.
(関数とは違う振る舞いをするから)
##quote識別子
> (quote var)
varを記号型にする.
記号型:=変数みたいなもの
(setq x 10)
はできるけど, (set x 10)
はできない.
set
のときは,引数に記号型を渡さなければならない.
ということで, (set (quote x) 10)
とすればいい.
'(set 'x 10)' も可.
リスト
配列とは違うけど似てる
>(list 1 2 3 4 5)
(1 2 3 4 5)
>(list (list 1 2 3) (list 10 20 30) 100 200 300)
(1 2 3) (10 20 30) 100 200 300)
(1 2 3)
は,関数1と引数2 3と評価されてしまう
評価しないようにするには, '(1 2 3)
とすればいい.
> (setq x 10 y 20 z 30)
30
> x
10
> (list x y z)
(10 20 30)
> '(x y z)
(X Y Z)
リストの操作
car list
リストの先頭を取得
cdr list
先頭以外を取得
cons addValue list
先頭にデータを追加
>(setq x '(10 20 30))
(10 20 30)
>(car x)
10
>(cdr x)
(20 30)
>(car (cdr x))
20
>(cons 5 x)
(5 10 20 30)
##リストの長さ
length seqence
要素がないリストを nil
と表記する.
#すべてはリスト
(+ 10 20)
も,正体はリスト
##リストを評価(実行)する
eval form
>(setq add '(+ x y))
>(setq x 10 y 20)
>(eval add)
20
#比較演算
多項比較できる
>(< 1 2 3)
T
>(< 1 2 2)
F
#if文
これも特別式
(if (< x y) (setq z 20))
##progn 特別式
ifによって,複数の式を評価するときにつかう
>(if (< 1 2) (setq x 10) (setq y 20))
10
>x
10 ;動く
>y
error ;動かない
>(if (< 1 2) (progn (setq x 10) (setq y 20)))
20
>x
10
>y
20
whenとかunlessっていうマクロもある
##else ifのようなもの
(cond
((= x y) (setq z 1))
((< x y) (setq z 2))
((> x y) (setq z 3))
)
##switchのようなもの
#gotoのようなもの