CommonLispの勉強

なんとなく

;; すべて list
;; 各要素は atom
(+ 1 2 3)

;; setq でも変数を定義できるが
;; 古い書き方らしい
(setf a 10)
a ;;=> 10
(setf b '(1 2 3))
b ;; (1 2 3)

;; 'x は (quote x) と同じ
;; x を評価しない

;; cons cell
;; CAR(カー) と CDR(クダー)
;; car, cdr は古い書き方らしい
(first '(1 2 3)) ;;=> 1
(car '(1 2 3)) ;;=> 1

(rest '(1 2 3)) ;;=> (2 3)
(cdr '(1 2 3)) ;;=> (2 3)

;; cons, list, append
(setf x '(1 2 3))
(cons x '(4 5)) ;;=> ((1 2 3) 4 5)
(cons 'x '(4 5)) ;;=> (x 4 5)

(list x '(4 5)) ;;=> ((1 2 3) (4 5))
(list 'x '(4 5)) ;;=> (x (4 5))
(list x 4 5) ;;=> ((1 2 3) 4 5)

(append x '(4 5)) ;;=> (1 2 3 4 5)

;; dot表現
'(a . nil) ;; === '(a)
'(a . (b . (c . nil))) ;; === '(a b c)

;; 関数
(defun square (x) (* x x))
(square 4) ;;=> 16

;; Lexical Variable: (setf x 10) などで定義したxに影響はしない
;; Special Variable, Global Variable

(setf y "bar")
(defun foo(x) (print x) (print y))
(foo "foo")
;;=> "foo"
;; "bar"
;; "bar"

;; let: Lexical var を定義
;; let の実行が終了するまで値を束縛する
(setf x 1)
(setf y 2)
(let ((x 100) (y 200)) (print x) (print y))
;;=> 100
;; 200
;; 200
x ;;=> 1
y ;;=> 2

;; equal, eq
;; equal: 値が同じかどうか
;; eq: メモリ番地が同じかどうか
(equal (+ 1 2 3) 6) ;; t

(setf a "foo")
(setf b "foo")
(equal a b) ;; t
(eq a b) ;; nil

;; =, /=, <, >, <=, >=
(= 4 4.0) ;; t
(/= 4 2) ;; t, 引数は 2つまでしか取れない? elispだから?
(> 4 2 1) ;; t
(>= 4 2 3 1) ;; nil

;; データ型チェック
;; atom, numberp, integerp, floatp,
;; symbolp, stringp, listp, consp
(listp nil) ;; t
(atom t) ;; t

;; typep
(typep t 'atom) ;; t

;; type-of

(type-of '(a b c)) ;; cons
(type-of "foo") ;; simple-string