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

Slides:



Advertisements
Similar presentations
C 言語講座第 5 回 構造体. 構造体とは ... 異なる型の値をまとめて新しい型とする 機能がある . つまり , 複数の変数を 1 つのまとまりにできる . 配列と違って同じ型でデータをまとめるのではな く違った型のデータをまとめられる .
Advertisements

プログラミング言語論 第3回 BNF 記法について(演習付き) 篠埜 功. 構文の記述 プログラミング言語の構文はどのように定式化できるか? 例1 : for ループの中に for ループが書ける。 for (i=0; i
わんくま同盟 東京勉強会 #10 オブジェクト指向 #1 Windows メッセージを使いこな す -Windows 流オブジェクト指向 - とっちゃん 高萩 俊行 Microsoft MVP for Windows SDK 2005/ /09.
VBA の基礎 (Visual Basic for Application) 国立教育政策研究所 坂谷内 勝.
アルゴリズムとデータ構造 第2回 線形リスト(復習).
(Rubyistのための) 超音速:ML入門
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
プログラミング言語論 第8回 LISP 担当:犬塚.
プログラミング言語論 関数型プログラミング言語 水野嘉明
東京工科大学 コンピュータサイエンス学部 亀田弘之
京都大学情報学研究科 通信情報システム専攻 湯淺研究室 M2 平石 拓
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
ゲームプログラミング講習 第1章 DXライブラリ入門
言語処理系(4) 金子敬一.
C#によるWindowsFormApplication入門
実行時のメモリ構造(1) Jasminの基礎とフレーム内動作
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
最適化ソルバーのための Python言語入門
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
ISD実習E 2009年6月1日 read関数 read-macro back-quote 文字列のread 課題
情報工学概論 (アルゴリズムとデータ構造)
2006/10/19 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井英二郎
条件式 (Conditional Expressions)
Boost.勉強会 #8 大阪 ( ) C++ Tips 3 カンマ演算子編.
情報教育論 第9回 仮定文の仕組み 政策・メディア研究科 岡田 健.
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
の まとめ 2007/04/02 (Mon) / d;id:hzkr
Tokuda Lab. NISHIMURA Taichi
初年次セミナー 第2回 文字の出力.
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
アスペクト指向プログラミングを用いたIDSオフロード
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
プログラミング言語論 第3回 BNF記法について(演習付き)
図書館職員のための アプリケーション開発講習会
京都大学情報学研究科 通信情報システム専攻 湯淺研究室 D1 平石 拓 2005/10/18
インラインスクリプトに対するデータフロー 解析を用いた XHTML 文書の構文検証
プログラミング 4 記憶の割り付け.
デバッガ dbx の使い方.
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
4.リスト,シンボル,文字列.
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
B演習(言語処理系演習)第2回 田浦.
C言語 はじめに 2016年 吉田研究室.
15.cons と種々のデータ構造.
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
統計ソフトウエアRの基礎.
コンパイラ 2012年10月1日
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
Webページに動きを持たせるJavascript言語について 例題のプログラムを通して体験的に理解することとします。
執筆者:難波和明 授業者:寺尾 敦 atsushi [at] si.aoyama.ac.jp
情報処理Ⅱ 第7回 2004年11月16日(火).
コンパイラ 2012年10月11日
プログラミング 4 文字列.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
PROGRAMMING IN HASKELL
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
関数と再帰 教科書13章 電子1(木曜クラス) 2005/06/22(Thu.).
プログラミング演習I 2003年6月11日(第9回) 木村巌.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
情報処理Ⅱ 2005年11月25日(金).
第10回 関数と再帰.
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
1.2 言語処理の諸観点 (1)言語処理の利用分野
プログラミング言語論 プログラミング言語論 演習7 解答と解説 演習7 解答と解説 1.
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
プログラミング 3 ポインタ(1).
Presentation transcript:

Debianにおける Common Lispプログラミング環境 日比野 啓

自己紹介 仕事はISPでプログラマー JavaとかPerlでシステム開発 インフラまわりの自動化のためにDebianを 活用 趣味でもプログラミング やっぱりDebianで OCamlとかSchemeとか

動機付け 高階関数の抽象化パワーを普段のプログラミ ングに取り入れたい Perlにも機能はあるけどちょっと使い勝手 がよくない コンパイル時型検査付きの方はOCamlでいい や INRIAのOCamlは高速なネイティブコンパ イラもある 本物の処理系 どうせ動的型ならマクロが欲しい Common Lispは実用的な処理系もいろいろあ るように見える SBCL, CMUCL, Allegro Common Lisp

DebianでCommon Lispしたい

今回の話の流れ Common Lispってどんな言語? S式とLispのプログラム 関数とマクロ ライブラリとマクロの関係 Debianによるライブラリコンパイル支援機能 Emacsによる開発環境

Common Lispはどんな言語か - プログラムの構文 - 構造と対応づけて説明したいので、'.' を使っ た記法から

プログラムの構文 - S式 - S-exp : () | token | (S-exp . S-exp) S式は 空の括弧() かtokenか S式のペア – ドッ トをはさんで括弧でくくる 例: (A . B) ((A . ()) . (B . ())) (A . (B . (C . ())))

S式 – ドットペア - ポインタの組を考えるとわかりやすい (A . B) B A

S式 – ドットペア - ポインタの組を考えるとわかりやすい ((A . ()) . (B . ())) () B () A

S式 – ドットペア - ポインタの組を考えるとわかりやすい (A . (B . (C . ()))) () A B C

S式 – ドットペア - このポインタの組のことをconsセルと呼ぶ 左がcarで右がcdr cdrがconsセル あるいは空の()を指していると き、 . と内側の ( ) を省略できる

S式 – リスト - cdrがconsセル あるいは空の()を指していると き、 . と内側の ( )を省略できる B A (A . B) - 省略できない

S式 – リスト - cdrがconsセル あるいは空の()を指していると き、 . と内側の ( )を省略できる ((A . ()) . (B . ())) () ((A) . (B . ())) B ((A) B . ()) () ((A) B)) A

S式 – リスト - cdrがconsセル あるいは空の()を指していると き、 . と内側の ( )を省略できる (A . (B . (C . ()))) (A B . (C . ())) () (A B C . ()) A B C (A B C)

S式 – リスト - cdrで連なる連結リストを簡潔に表現 空の括弧() は要素が一つもない空のリスト (A . (B . (C . ()))) (A B C) () A B C

プログラムの構文 – リスト - . の省略まで含んだものが一般的なS式 Common Lispだと他にも省略がある Common Lispでは空のリストを nil と書くこ とができる LispのプログラムはすべてS式で表現されてリ スト構造と等価になる

Common Lispのプログラム ここからは実際の対話環境でも試した内容 黒字 がユーザーの入力、青字 が対話環境の出 力、 赤字 がユーザーのプログラムの出力 対話環境の紹介は後ほど

関数 定義済みの関数 +, *の呼び出し リストの最初の要素が関数の名前 引数の計算(評価)を行なったのちに関数の呼 び出しを行なう 対話環境は評価の結果を出力する CL-USER> (+ 1 2 3) 6 CL-USER> (* (+ 1 2) 3) 9

関数 (defun <関数名> (引数*) [<省略可能なドキュメント文字列>] <本体の 式>*) 最後の本体の式の結果が関数の返り値 CL-USER> (defun my-plus (x y) (+ x y)) MY-PLUS CL-USER> (my-plus (* 2 3) 2) 8

特殊オペレーター 構文がS式しかない 条件分岐とかループとかどうする? 特殊オペレーターの例 - if (if <式> <条件がnilではない> [<条件がnil>]) CL-USER> (if t (print "then") (print "else")) "then" CL-USER> (if nil (print "then") (print "else")) "else"

特殊オペレーター 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"

特殊オペレーター ループを実現できる特殊オペレーターgo があ る Cのgotoみたいなもの 他にもいろいろあるけど今回はDebianの話な ので割愛

マクロ S式で表現できる構文を自分でも定義すること ができる 定義済みのマクロandの呼び出し 引数の式の評価が真である限りは残りを評 価 最後に評価した値が結果 引数が無い場合は tが結果 CL-USER> (and (print "A") (print "B") (print "C")) "A" "B" "C" CL-USER> (and (print "A") nil (print "C")) NIL

マクロ マクロはS式からS式への変換 macroexpand-1で展開結果を見る 最初の引数を条件とするifの式 評価はマクロがすべて展開された後 マクロは展開の前には引数を評価しない CL-USER> (macroexpand-1 '(and (print "A") nil (print "C"))) (IF (PRINT "A") (AND NIL (PRINT "C")) NIL) T

マクロ マクロはリストからリストへの変換でもある マクロを理解するにはリスト構造を意識する とよい ... AND (print “A”) NIL () IF (print “A”) ... AND NIL

マクロ 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

マクロ () 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

マクロ オリジナルの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

マクロ – まとめ - (defmacro <マクロの名前> (<引数>*) [<ドキュメント文字列>] <本体の式>) マクロを定義するにはリスト構造を変換する ようなプログラムを書く 定義の中身はマクロの変換のときに評価され る

Common Lispのライブラリとマクロ マクロの展開はマクロ定義の実行をともなう

Common Lispのライブラリとマクロ Ex. マクロを呼び出しているあるライブラリX があるとすると、Xのコードはマクロ定義 をすべて展開した後でないとコンパイルで きない 対話環境でいろんなライブラリをコンパイ ルが済んだ状態でロードしておきたい – 起 動するたびに展開しなおしていたら遅い マクロの展開とコンパイルが済んだ状態での 実行中のイメージをダンプしておく

ASDF Another System Definition Facility Makefileみたいなもの ライブラリモジュール(system)や.lispファイ ルの依存関係を.asdに記述 Debianだとcl-asdfパッケージ

Common Lisp Controller ダンプイメージ作りなおしを支援してくれる ツール ASDFに対応しているライブラリならコンパイ ルしてロードされた状態にするように設定で きる /etc/common-lisp/image/<処理系の名前>に .asdファイルの名前を書く ダンプイメージをサポートしている処理系な ら利用できる clisp, cmucl, ecl, gclcvs, sbcl

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

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 を実行

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プログラムの ファイルをロードする

Hyperspec ANSI Common Lispの仕様のオンラインドキュメ ント Debianではhyperspecというインストーラーの パッケージがある Slimeから読むことができるようになっている C-c C-d h slime-hyperspec-lookup カーソル位置の ワードでHyperspecのドキュメント内を検索

ご静聴ありがとうございました