!!!言語まとめ Lisp [言語 まとめ][Lisp] 以下から参照、引用 *Emacs Lisp Programing http://www.bookshelf.jp/texi/elisp-intro/jp/emacs-lisp-intro.html *Common Lisp 入門 http://wisdom.sakura.ne.jp/programming/lisp/index.html !!!リスト処理 !!リスト *リストを以下のように書く '(rose violet daisy buttercup) *データとプログラムのどちらも同じ方法で表現する。どちらも、単語や数やリストを空白で区切って括弧で囲んだリストである。 ""リストの直前に付けた1つのアポストロフィ'を クオートと呼び、リストの直前にこれを付けると、そのリストに関しては何もせずに字面どおりに扱うことをLispに指示する。リストの直前にクオートがない場合には、リストの先頭要素を特別扱いし、コンピュータが従うべきコマンドとなる !!アトム *これまで単語と呼んできたものをアトム(atoms)と呼ぶ。 *リストでは、アトムを空白で区切る。アトムは、括弧のすぐ隣にあってもよい。 *リストは、たった1個のアトムを含むだけでも、まったく含まなくてもよい。 *何も含まないリストは()のように書き、空リスト(empty list)と呼ぶ。 *空リストは、それ以外のものとは異なり、アトムであると同時にリストでもある。 !!!プログラムの実行 *リストの直前にクオートがない場合には、リストの先頭要素を特別扱いし、コンピュータが従うべきコマンドとなる。 >(+ 1 2) 3 !!シンボル名と関数定義 *+のようなシンボルは、それ自身はコンピュータが実行すべき命令列ではない *定義、すなわち、命令列を探すためにシンボルを(一時的に)使う !!インタープリタ !基本動作 +リストの直前にクオートがあるかどうかを調べる。 +クオートがあれば、リストを返すだけ。 +クオートがなければ、インタープリタはリストの先頭要素を調べ、それに関数定義があるかどうかを調べる。 +関数定義があれば、インタープリタはその関数定義内の命令列を実行する。 +さもなければ、インタープリタはエラーメッセージを出力する。 !特別な動作 ::変数 *リストに加えて、クオートもせず括弧で囲まれてもいないシンボルを評価できる *変数(variable)としてのシンボルの値を決定しようとする ::スペシャルフォーム *特殊な関数があり、これらは普通の方式のように動作しない。これらをスペシャルフォーム(special forms)と呼ぶ。関数の定義などの特殊なことを行うものであり、それらの個数は多くはない。 ::ネストしたリスト *インタープリタが探しあてた関数がスペシャルフォームでなく、しかも、それがリストの一部である場合には、 Lispインタープリタはリストの内側にリストがあるかどうかを調べる。内側にリストがあれば、Lispインタープリタは内側のリストを処理してから、外側のリストを処理する。 !!!引数 !!データ型 *関数に渡すデータの型は、関数が使用する情報の種類に応じて決まる。 *+は数を加算するので、 +のような関数への引数は数値である必要がある。 !!引数としての変数やリストの値 *引数は、評価したときに値を返すシンボルでもよい。 !!可変個数の引数 *+、*などのある種の関数は、任意個数の引数を取る !!!変数 !!値の設定 *setかsetqを使う *letを使う !setの使い方 *シンボルflowersの値としてリスト'(rose violet daisy buttercup)を設定する >(set 'flowers '(rose violet daisy buttercup)) (ROSE VIOLET DAISY BUTTERCUP) >'flowers FLOWERS >flowers (ROSE VIOLET DAISY BUTTERCUP) ""setを使う場合、いずれの引数も評価してほしくない場合には、両方の引数をクオートする必要がある !setqの使い方 *実用上、setの第1引数をほとんどつねにクオートするはず *setで第1引数をクオートする組み合わせは多用されるので、スペシャルフォームsetqが用意してある *setとほとんど同じであるが、第1引数を自動的にクオートするので、引用符をタイプする必要はない >(setq flowers '(rose violet daisy buttercup)) (ROSE VIOLET DAISY BUTTERCUP) >flowers (ROSE VIOLET DAISY BUTTERCUP) *さらに、setqは、複数の異なる変数に異なる値を代入するためにも使える。 >(setq alpha '(a b c) num '(1 2 3)) (1 2 3) >alpha (A B C) >num (1 2 3) !!!関数定義 !!defun *シンボルには、関数として呼ばれたときにコンピュータが実行するコードが結び付けられている。 *このコードを関数定義(function definition)と呼び、シンボルdefun(define function(関数を定義する)の略)で始まる Lispの式を評価することで作成する *defunは、その引数を通常のようには評価しないので、 スペシャルフォーム(special form)と呼ばれる。 ::書式 defun 関数名 (引数) "関数の説明(省略可)" 関数本体 ::例 >(defun pow (x) "power" (* x x)) POW >(pow 2) 4 !!!条件判定 !!if ::書式 *第1要素がifであるリストの第2要素と第3要素のそれぞれに、判定条件と真の場合の動作を指定する。 (if 判定条件 真の場合の動作) ::例 >(if (> 5 4) '("5 is greater than 4")) ("5 is greater than 4") >(if (> 5 6) '("5 is greater than 4")) NIL !!If--then--else式 *if式には第3引数を指定することもでき、判定条件が 偽の場合の動作である。 >(setq x 2) 2 >(if (= x 1) '("x is 1") '("x is not 1")) ("x is not 1") !!偽について