lisp study
TRANSCRIPT
Lisp勉強会 2012.10.07@cafe?IKAGAWA DO
14:00~17:00
( 始める前に注意点
( Lispそこまで詳しくない )
( 途中いきつまる可能性がある )
)
→ みんなで教え合って解決していきたい
準備
• Emacs もしくは xyzzy のインストール
できてますか?
勉強会の流れ
Lispの考え方
Lispの文法 Lispの演習
Emacs,xyzzy カスタマイズ
Lisp 考え方
Lispの二大重要単語
リストとは括弧で
括ったもの
例
(emacs vim xyzzy)
("睦月" "如月" "弥生" "卯月")
アトム (atom)
リスト
(list)
リストの中にあるものがアトム
例
(emacs vim xyzzy)
("睦月" "如月" "弥生" "卯月")
コレ アトム (atom)
((emacs) vim xyzzy)
これは、リストの中にリストがあると考える
これは、アトムです
S式
アトム (atom)
リスト
(list)
Lisp 文法 +演習
基本 リストで括って作る。
Lispの由来
「List Programing」
プログラミング言語なので関数を利用していきます。
(関数名 引数1 引数2 …)
例
(car ‘(a b))
関数 car
関数以外のものは シングルクォーテーションを つける。
関数を入れ子構造で書いて使っていく。
(関数2 (関数1 引数1 引数2 …))
※使う関数が増えると括弧が複雑になるので注意
Lisp基本関数
cdr car
cons
car 関数の紹介
(car ‘(helloworld goodbyeworld world))
を動かしてみてください
①
②
scratchバッファを選んで プログラムを入力
ctrl J プログラム入力直後のこの位置にカーソルを置く!
car関数
(helloworld goodbyeworld world)
先頭要素を取り出す関数
helloworld
演習問題
先ほどの演習をもとに次のリストから
Appleを取り出してください。
((Apple) Banana Orange)
※注意点
リストの先頭にシングルクォーテーションを付ける。
実行は です。
ctrl J
• 回答
(car (car ‘((Apple) Banana Orange)))
cdr関数の紹介
演習
(cdr ‘((Apple) Banana Orange))
を動かしてみてください
carの残りをリストで返す
(Banana Orange)
演習問題
これまでの演習をもとに次のリストから
Bananaもしくは(Banana)を取り出してください。
((Apple Banana) Orange)
※注意点
リストの先頭にシングルクォーテーションを付ける。
実行は です。
ctrl J
• 回答
(car (cdr (car '((Apple Banana) Orange))))
(cdr (car '((Apple Banana) Orange)))
setq関数の紹介
(car (cdr (car '((Apple Banana) Orange))))
…だんだんと長くなってきて読みにくい。
そうだ!変数宣言だ。
(setq x '((Apple Banana) Orange))
(car (cdr (car x)))
cons関数の紹介
演習
(cons ‘a ‘((Apple) Banana Orange))
を動かしてみてください
一つ目の引数アトムを先頭に
加えたリストを返す
(a (Apple) Banana Orange)
※注意点
(cons atom list) のように一つ目の引数をアトム
二つ目の引数をリストとする。
演習問題 事前に (setq s ‘Apple) (setq l ‘(Banana (Orange Grape))) として、変数宣言してください。
これまでに紹介した関数 「car」「cdr」「cons」 を用いて、上で宣言した二つの変数から、 (Apple Orange) というリストを返すプログラムを作ってください。
• 回答
(setq s 'Apple)
(setq l '(Banana (Orenge Grape)))
(cons s (cdr (car (cdr l))))
条件式関係の関数などの紹介
or
cond
eq
t nil
null
eq 引数二つが同じものか確かめる関数
(eq ‘a ‘a) → t
or 引数のどれかが t の時 t を返す
(or (eq ‘a ‘a ) (eq ‘a ‘b )) → t
cond
条件式
t…リスト、アトム、t
nil…それ以外
(eq ‘a ‘b)
nil
① (setq l ‘(Apple Banana Orenge))
② (setq l ‘(Banana Orenge))
③ (setq l ‘(Orenge Banana))
(cond
((eq (car l) ‘Apple) t)
((eq (car l) ‘Banana) (car l))
(t nil))
cond関数の紹介
C言語のswitch-Case文でいうdefault文
①の時 t を返す!
②の時 Bananaを返す!
③の時 nil を返す!
関数を作る関数の紹介
(defun 関数名 (引数)
処理
)
defun関数
例
car関数の動きをするfirster関数を作る
※リストの一番目の要素を取り出す関数
(defun firster (l)
(car l)
)
問題
リストの2番目の要素を取り出す関数「seconder」を作ってください!
(defun 関数名 (引数)
処理
)
• 回答
(defun seconder (l)
(car (cdr l))
)
null関数の紹介
• null関数はリストが空の時 t を返す
(null ‘())
• 加えて、nilが引数の時 t を返す
(null nil)
•再起関数を作ろう!
問題
一つ目の引数アトムが
二つ目の引数リストにある場合t を返す関数
member1を作ってください 。
(defun member1 (s l)
(cond
((null l) nil)
(t (or (eq (car l) s)
))))
(member1 s (cdr l))
S…’apple l…’(apple banana orange) の時はtを返す null…リストが空の時 t
問題
先ほど解説した関数member1を改造して
member1がtのとき、aをのぞいたリストを返す関数member2を作ってみてください。
もしできたら
今夜のプレゼンナイトで
ソースレビューもしてみてください。
Emacs , xyzzy の
カスタマイズ
カスタマイズに必要なこと
1. 豊富なEmacs,xyzzy関数を扱うことが必要
2. カスタマイズファイルが必要
3. デバッグが必要
~/.emacs ~/.xyzzy
define-key beginning-of-buffer … etc
scratchバッファを使う
キーボードの設定
必要な関数
global-set-key
キーを設定する関数
(global-set-key "¥C-h" 'delete-backward-char)
もしうまく動かなかったら
(define-key global-map (kbd "C-h")
'delete-backward-char)
ctrl x を押してください
エディタを開いた状態で
そのあとに を押してください F
パスは関係ないとして、上のようにパスと ファイル名 .xyzzyもしくは、.emacsと書いてください。
• さきほどscratchに書いたキーボードの設定を
.xyzzy、.emacsに書いておくことで
次回からC-hでbackspaceが使えます。
この調子でどんどんカスタマイズしていってください。
気に入らない部分があれば 自分の手になじむように カスタマイズ