Presentation is loading. Please wait.

Presentation is loading. Please wait.

Debianにおける Common Lispプログラミング環境

Similar presentations


Presentation on theme: "Debianにおける Common Lispプログラミング環境"— Presentation transcript:

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 ご静聴ありがとうございました


Download ppt "Debianにおける Common Lispプログラミング環境"

Similar presentations


Ads by Google