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


PIC
____________________________________________________________________

5.1 Common Lisp はどんな言語

Debian Common Lisp のためにしているみが的としているのかなぜそのようなみがされているの かをするためにまずは Common Lisp がどんな言語ライブラリをどのようにしているのかを ます

5.1.1 Lisp プログラム

Lisp プログラムS ばれるクン表現されます表記造をづけてするため まずは. 使表記からします

 S-exp  : () | token | (S-exp . S-exp)

S () クンS ペア (をはさんででくくたもの) ということになりますS ペア 造をえるには以下のようなポインタえると造的ながしやすいです

 (A . B)

PIC

((A . ()) . (B . ()))

PIC

(A . (B . (C . ())))

PIC

このポインタペアのことを Lisp では cons セルびます側のポインタcar側のポインタcdr ます

cdr cons セルあるいは() している. cdr ( ) 略できます

PIC

PIC

このように cdr 連なる連結リスト表現することができます() つもないリストというこ とですCommon Lisp ではリスト () nil くこともできますこの . 略までんだのが的に S ばれて いる表記です

Lisp はこのリスト造で表現されるプログラムすることでできますLISP LISt Processing language 略だというわけですLISP プログラムリスト造とであるということがポイントなの しておいてください

5.1.2 Common Lisp プログラム

ではLisp プログラムていきましここからプログラムしながらしていきます CL-USER>というのがプロンプトです

ではもともとされているしてみます足しなう+です

CL-USER> (+ 1 2 3)

6

リスト名前りのですかけ*使てみまし

CL-USER> (* (+ 1 2) 3)

9

たのちにしがなわれますこののことを評価すると ます

分でもてみまし

CL-USER> (defun my-plus (x y)
 (+ x y))
MY-PLUS
CL-USER> (my-plus (* 2 3) 2)
8

2 つの足しするできました

(defun <> (<>*) [<略可能なドキメント文字>] <>*)

最後body form になります

オペレ- special operator Common Lisp 文はほぼ S しかありませんでは分岐といプログラム御構造はどうや ているのでしうか

たとえば分岐なうためにifというオペレがありますtしたいときに的に使する です

(if <> <nil ではない> [<nil>])
CL-USER> (if t (print "then") (print "else"))

"then"
"then"
CL-USER> (if nil (print "then") (print "else"))

"else"
"else"

Common Lisp ではnilでそれです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"
"then"

というようにthen部分else部分my-ifですから両方とも評価されたmy-if されてし まうのです

長くなりそうなのでしくはべませんができる能としては C goto のような動きをするgoという オペレがあります

マクロ Lisp では S 表現できる文を分でもすることができますそれが Lisp マクロです

まずはもともとされているマクロ and 使てみます

CL-USER> (and (print "A") (print "B") (print "C"))

"A"
"B"
"C"
"C"
CL-USER> (and (print "A") nil (print "C"))

"A"
NIL

andマクロ評価であるかぎりはりを評価(nil) より評価しません最後評価した になります無いtになりますマクロS S する能だとえるとわかりやすいです れはあるリスト造をリスト造にするということでもありますmacroexpand-1使うとandマクロでどの ようななわれたのかをることもできます

CL-USER> (macroexpand-1 ’(and (print "A") nil (print "C")))
(IF (PRINT "A") (AND NIL (PRINT "C")) NIL)
T

とする if になりました評価マクロされたなわれますリストだと みれば以下のようなです

PIC

マクロ動きをするには S リストづけてていくのがコツです

マクロ 分でもandマクロのようなものしてみます

CL-USER> (defmacro my-and (&rest forms)
 (if forms
     (list ’if (car forms) (cons ’my-and (cdr forms)))
     t))
MY-AND
CL-USER> (my-and (print "A") (print "B") (print "C"))

"A"
"B"
"C"
T
CL-USER> (my-and (print "A") NIL (print "C"))

"A"
NIL
CL-USER> (macroexpand-1 ’(my-and (print "A") nil (print "C")))
(IF (PRINT "A") (MY-AND NIL (PRINT "C")))
T

carcons セルから car list複数リストにしてcons2 つのcar cdr cons セルです&restリストけとるためのパラメ です

このようにマクロリスト造をするようなプログラムいてないますマクロマクロ のときに評価なわれるということがここでのポイントです

たような動きをしているようですがオリジナルandとはています最後評価されたものがにはなてい ないようですここでは単純にするために動きをえてみました

(defmacro <マクロ名前> (<>*) [<略可能なドキメント文字>] <>*)

5.2 Common Lisp ライブラリマクロ

Common Lisp にも他の的な言語同様多くのライブラリがあります他の言語とはなるかもしれないライブ ラリマクロ存在ですマクロ展開がすべてでないとプログラムコンパイルすることができないか らです

たとえばあるライブラリ A ライブラリ B マクロ使しているかもしれませんするとA B マク をすべて展開したでないとコンパイルすることができませんさらに発をなうことをえたとき することにしているライブラリコンパイルんだしておきたいとうかもしれませんそのときにはライ ブラリしたマクロ展開ないそのコンパイルする必要があるのです多くの イブラリ使することにしていたら利用できるにするまでに多くのがかかてしまい ます

このようなするためにLisp ではマクロ展開コンパイルんだイメダンプして 存しておいて利用するのが的です

5.2.1 ASDF - Another System Definition Facility

Common Lisp ライブラリコンパイルするためのライブラリとして ASDF がありますMakefile のようなもので ンパイル必要しておくことができますASDF ではライブラリモジのことを system んでいて system ごとに名前 (system name) けることになています同じモジイル存関があ はそれをしますコンパイル必要system があるはその system name しま Debian では cl-asdf です以下SBCL ドキメントにあASDF システム です

    (defpackage hello-lisp-system
      (:use :common-lisp :asdf))

    (in-package :hello-lisp-system)

    (defsystem "hello-lisp"
        :description "hello-lisp: a sample Lisp system."
        :version "0.2"
        :author "Joe User <joe@example.com>"
        :licence "Public Domain"
        :components ((:file "packages")
                     (:file "macros" :depends-on ("packages"))
                     (:file "hello" :depends-on ("macros"))))

hello-lispという名前システムています

5.2.2 Common Lisp Controller

Common Lisp ダンプイメりなおしてくれるですするとダンプイメ てくれますライブラリインストするとごとにダンプイメ直してくれま ライブラリASDF していることがですDebian では common-lisp-controller です

5.2.3 dh-lisp

Common Lisp ライブラリDebian common-lisp-controller させるためのをして くれるです

ビルドdh_lisp コマンドすようにするとASDF いたイル (.asd) してcommon-lisp-controller メンテナスクリプトしてくれます common-lisp-controller メンテナスクリプトからびだされたときには asd イル名前ダンプイメ直し かどうか調べてからダンプなわれます/etc/common-lisp/images/<implementation>asd イル名前 いておくと直しのになります

だ と え ば ジ イ ン ス ト に は 以 下 の よ う な さ れ ま す

if [ "$1" = "configure" ] &&
   which register-common-lisp-source > /dev/null; then
   register-common-lisp-source "#SYSTEMDIR#"
fi

#SYSTEMDIR#asd イル名前わります

Common Lisp するにはダンプイメスクリプトしてdh_lisp 与える名前わせた名前けてやればやはり common-lisp-controller メンテナスクリプト てくれます

だとえばジインストには以下のようなされます

case "$1" in
   configure)
           if [ -x /usr/lib/common-lisp/bin/"#IMPLEMENTATION#.sh" ] &&
               which register-common-lisp-implementation > /dev/null; then
               register-common-lisp-implementation "#IMPLEMENTATION#"
           fi
           ;;
   abort-upgrade|abort-remove|abort-deconfigure)
           if which register-common-lisp-implementation > /dev/null; then
               unregister-common-lisp-implementation "#IMPLEMENTATION#"
           fi
           ;;
esac

#IMPLEMENTATION#dh_lisp 与える名前わります

5.3 Emacs での発環

最後使している Emacs をしておきます

5.3.1 SLIME - Superior Lisp Interaction Mode for Emacs

SLIME Emacs Lisp 発環ですDebian では slime というていますEmacs 側の Elisp かれ クライアントLisp 側でかれたしながら的な発環していますLisp 側で かれたswank ばれていますswank すれば他の Lisp でも slime 使うことができる らしいです

Emacs からの利用方法ですがたとえばSBCL 使する.emacs には以下のようにいておけばよいで

(setq slime-auto-connect ’ask)
(setq inferior-lisp-program "sbcl")

Emacs バインド的にしてみるときに使いそうなものをげておきます

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 プログラムイルする
5.3.2 Hyperspec

ANSI Common Lisp オンラインドキメントSLIME からむことができますDebian では hyperspec という インストになています

たとえば w3m-el れておいた.emacs

(set-default ’browse-url-browser-function ’w3m-browse-url)

などとやておくと emacs マクロヘルプむことができますバインドドキメント なうことができます

C-c C-d h slime-hyperspec-lookup
ソルHyperspec ドキメント

5.4 文献

50 エリア Debian 2009 3
____________________________________________________________________________________________