今使えるlispの技

今まで何度と無く、手を出しては途中で投げ出していたlispだが、
電卓程度の使い方ぐらいは覚えてみよう、と、まとめてみた。



にわかlisp野郎のxyzzyで使えるlispの文法
簡単な計算(☆はCtrl+jを押す)

;1+3=4 足し算
(+ 1 3)☆
;100 * 20 = 2000 掛け算
(* 100 20)☆
;6 - 2 = 4 引き算
(- 6 2)☆
;56 / 8 = 7 割り算
(/ 56 8)☆
Lispの世界では演算子を前に置き、演算対象(数字)を引数に取る。
あとは、カッコの中身を入れ子にしていくらでも複雑な計算が可能

; カッコを入れ子にする
; (1+(20 * 3)) / 4 = 15.25
(/ (+ 1 (* 20 3)) 4.00)☆
; 3項以上を引数に取る計算
; (1 + 3 + 5) - 2 - 4 - 6 = -3
(- (+ 1 3 5) 2 4 6)☆
実際にはlisp-interaction-modeの勝手にインデントしてくれる機能を使うことが多い
同じような計算は関数としてまとめることができる

; 2乗を返す関数を定義
(defun square (x) (* x x))
; 関数呼び出し
(square 3)☆ → 9が返る
; 引数Aの2乗した数にBを足す関数を定義
(defun sqAB (a b) (+ b (* a a)))
リスト構造操作方法

;変数への代入
(setq a 100) ; a = 100
(+ a 20) ; 120を返す

;リスト構造の基本
(setq z '(a b c d e)) ; zに(a b c d e)を代入
(a b c d e)

;(lisp独特の言い回しでは代入より束縛という言葉を使う)
; (a b c d e)からaだけ取り出す
(car z)☆ → aが返る
; (a b c d e)から(b c d e)だけを取り出す
(cdr z)☆ → (b c d e)が返る

ドット対の構造

(a) == (a . nil)
(a b c d) == (a . (b . (c . nil)))
n進数の変換
16進数の数ffffffを10進に変換するには頭に#xをつけるだけで良い

#xffffff☆ → 16777215
とりあえず今日はこれまで。