Download presentation
Presentation is loading. Please wait.
1
Debianにおける Common Lispプログラミング環境
日比野 啓
2
自己紹介 仕事はISPでプログラマー JavaとかPerlでシステム開発 インフラまわりの自動化のためにDebianを 活用
趣味でもプログラミング やっぱりDebianで OCamlとかSchemeとか
3
動機付け 高階関数の抽象化パワーを普段のプログラミ ングに取り入れたい Perlにも機能はあるけどちょっと使い勝手 がよくない
コンパイル時型検査付きの方はOCamlでいい や INRIAのOCamlは高速なネイティブコンパ イラもある 本物の処理系 どうせ動的型ならマクロが欲しい Common Lispは実用的な処理系もいろいろあ るように見える SBCL, CMUCL, Allegro Common Lisp
4
DebianでCommon Lispしたい
5
今回の話の流れ Common Lispってどんな言語? S式とLispのプログラム 関数とマクロ ライブラリとマクロの関係
Debianによるライブラリコンパイル支援機能 Emacsによる開発環境
6
Common Lispはどんな言語か - プログラムの構文 -
構造と対応づけて説明したいので、'.' を使っ た記法から
7
プログラムの構文 - S式 - S-exp : () | token | (S-exp . S-exp)
S式は 空の括弧() かtokenか S式のペア – ドッ トをはさんで括弧でくくる 例: (A . B) ((A . ()) . (B . ())) (A . (B . (C . ())))
8
S式 – ドットペア - ポインタの組を考えるとわかりやすい (A . B) B A
9
S式 – ドットペア - ポインタの組を考えるとわかりやすい ((A . ()) . (B . ())) () B () A
10
S式 – ドットペア - ポインタの組を考えるとわかりやすい (A . (B . (C . ()))) () A B C
11
S式 – ドットペア - このポインタの組のことをconsセルと呼ぶ 左がcarで右がcdr
cdrがconsセル あるいは空の()を指していると き、 . と内側の ( ) を省略できる
12
S式 – リスト - cdrがconsセル あるいは空の()を指していると き、 . と内側の ( )を省略できる B A
(A . B) - 省略できない
13
S式 – リスト - cdrがconsセル あるいは空の()を指していると き、 . と内側の ( )を省略できる
((A . ()) . (B . ())) () ((A) . (B . ())) B ((A) B . ()) () ((A) B)) A
14
S式 – リスト - cdrがconsセル あるいは空の()を指していると き、 . と内側の ( )を省略できる
(A . (B . (C . ()))) (A B . (C . ())) () (A B C . ()) A B C (A B C)
15
S式 – リスト - cdrで連なる連結リストを簡潔に表現 空の括弧() は要素が一つもない空のリスト
(A . (B . (C . ()))) (A B C) () A B C
16
プログラムの構文 – リスト - . の省略まで含んだものが一般的なS式 Common Lispだと他にも省略がある
Common Lispでは空のリストを nil と書くこ とができる LispのプログラムはすべてS式で表現されてリ スト構造と等価になる
17
Common Lispのプログラム ここからは実際の対話環境でも試した内容 黒字 がユーザーの入力、青字 が対話環境の出 力、
赤字 がユーザーのプログラムの出力 対話環境の紹介は後ほど
18
関数 定義済みの関数 +, *の呼び出し リストの最初の要素が関数の名前 引数の計算(評価)を行なったのちに関数の呼 び出しを行なう
対話環境は評価の結果を出力する CL-USER> ( ) 6 CL-USER> (* (+ 1 2) 3) 9
19
関数 (defun <関数名> (引数*) [<省略可能なドキュメント文字列>] <本体の 式>*)
最後の本体の式の結果が関数の返り値 CL-USER> (defun my-plus (x y) (+ x y)) MY-PLUS CL-USER> (my-plus (* 2 3) 2) 8
20
特殊オペレーター 構文がS式しかない 条件分岐とかループとかどうする? 特殊オペレーターの例 - if
(if <式> <条件がnilではない> [<条件がnil>]) CL-USER> (if t (print "then") (print "else")) "then" CL-USER> (if nil (print "then") (print "else")) "else"
21
特殊オペレーター ifは関数で表現することはできない 引数がすべて評価されてからの呼び出しに なってしまう ifは引数を評価しない
CL-USER> (defun my-if (p then else) (if p then else)) MY-IF CL-USER> (my-if t (print "then") (print "else")) "then" "else"
22
特殊オペレーター ループを実現できる特殊オペレーターgo があ る Cのgotoみたいなもの
他にもいろいろあるけど今回はDebianの話な ので割愛
23
マクロ S式で表現できる構文を自分でも定義すること ができる 定義済みのマクロandの呼び出し 引数の式の評価が真である限りは残りを評 価
最後に評価した値が結果 引数が無い場合は tが結果 CL-USER> (and (print "A") (print "B") (print "C")) "A" "B" "C" CL-USER> (and (print "A") nil (print "C")) NIL
24
マクロ マクロはS式からS式への変換 macroexpand-1で展開結果を見る 最初の引数を条件とするifの式
評価はマクロがすべて展開された後 マクロは展開の前には引数を評価しない CL-USER> (macroexpand-1 '(and (print "A") nil (print "C"))) (IF (PRINT "A") (AND NIL (PRINT "C")) NIL) T
25
マクロ マクロはリストからリストへの変換でもある マクロを理解するにはリスト構造を意識する とよい ... AND (print “A”)
NIL () IF (print “A”) ... AND NIL
26
マクロ andマクロのようなものを定義してみる carはconsセルからcarを返す listは複数の引数をリストで返す
consは2つの引数をcar cdrの順に指すconsセ ルを作って返す CL-USER> (defmacro my-and (&rest forms) (if forms (list 'if (car forms) (cons 'my-and (cdr forms))) t)) MY-AND CL-USER> (macroexpand-1 '(my-and (print "A") nil (print "C"))) (IF (PRINT "A") (MY-AND NIL (PRINT "C"))) T
27
マクロ () IF (print “A”) ... MY-AND NIL
CL-USER> (defmacro my-and (&rest forms) (if forms (list 'if (car forms) (cons 'my-and (cdr forms))) t)) MY-AND CL-USER> (macroexpand-1 '(my-and (print "A") nil (print "C"))) (IF (PRINT "A") (MY-AND NIL (PRINT "C"))) T
28
マクロ オリジナルのandとはちょっと違う動き 最後に評価されたものが結果になっていな い (print “C”)の結果は”C”
CL-USER> (my-and (print "A") (print "B") (print "C")) "A" "B" "C" T CL-USER> (my-and (print "A") NIL (print "C")) NIL
29
マクロ – まとめ - (defmacro <マクロの名前> (<引数>*)
[<ドキュメント文字列>] <本体の式>) マクロを定義するにはリスト構造を変換する ようなプログラムを書く 定義の中身はマクロの変換のときに評価され る
30
Common Lispのライブラリとマクロ
マクロの展開はマクロ定義の実行をともなう
31
Common Lispのライブラリとマクロ
Ex. マクロを呼び出しているあるライブラリX があるとすると、Xのコードはマクロ定義 をすべて展開した後でないとコンパイルで きない 対話環境でいろんなライブラリをコンパイ ルが済んだ状態でロードしておきたい – 起 動するたびに展開しなおしていたら遅い マクロの展開とコンパイルが済んだ状態での 実行中のイメージをダンプしておく
32
ASDF Another System Definition Facility Makefileみたいなもの
ライブラリモジュール(system)や.lispファイ ルの依存関係を.asdに記述 Debianだとcl-asdfパッケージ
33
Common Lisp Controller
ダンプイメージ作りなおしを支援してくれる ツール ASDFに対応しているライブラリならコンパイ ルしてロードされた状態にするように設定で きる /etc/common-lisp/image/<処理系の名前>に .asdファイルの名前を書く ダンプイメージをサポートしている処理系な ら利用できる clisp, cmucl, ecl, gclcvs, sbcl
34
dh-lisp パッケージ作成支援 Common Lispの処理系 Common Lispのライブラリ
Common Lisp Controllerへのフックをメンテナ スクリプトに追加してくれる if [ "$1" = "configure" ] && which register-common-lisp-source > /dev/null; then register-common-lisp-source "#SYSTEMDIR#" fi
35
SLIME Superior Lisp Interaction Mode for Emacs Emacs用Lisp開発環境
今回使用した対話環境もこれ Ex. SBCLの場合 .emacs (setq slime-auto-connect 'ask) (setq inferior-lisp-program "sbcl") /etc/common-lisp/images/sbcl にswankと書いておく register-common-lisp-source swank を実行
36
SLIME C-c C-z run-lisp Lisp処理系との対話用バッファへスイッチ
C-c C-c slime-compile-defun カーソル位置の関数を対話用バッファの環境 でコンパイル C-c C-k slime-compile-and-load-file 編集中のプロラグラムのバッファのファイル を対話用バッファの環境でコンパイルして ロードする C-c C-l slime-load-file 対話用バッファの環境でLispプログラムの ファイルをロードする
37
Hyperspec ANSI Common Lispの仕様のオンラインドキュメ ント
Debianではhyperspecというインストーラーの パッケージがある Slimeから読むことができるようになっている C-c C-d h slime-hyperspec-lookup カーソル位置の ワードでHyperspecのドキュメント内を検索
38
ご静聴ありがとうございました
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.