「言語まとめ Lisp」の版間の差分
ナビゲーションに移動
検索に移動
(同じ利用者による、間の3版が非表示) | |||
1行目: | 1行目: | ||
− | ==言語まとめ Lisp== | + | ==[[言語まとめ Lisp]]== |
− | [[言語 まとめ][Lisp]] | + | [[言語 まとめ]] | [[Lisp]] | |
以下から参照、引用 | 以下から参照、引用 | ||
− | *Emacs Lisp Programing http://www.bookshelf.jp/texi/elisp-intro/jp/emacs-lisp-intro.html | + | *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 | + | *Common [[Lisp]] 入門 http://wisdom.sakura.ne.jp/programming/lisp/index.html |
==リスト処理== | ==リスト処理== | ||
===リスト=== | ===リスト=== | ||
*リストを以下のように書く | *リストを以下のように書く | ||
− | '(rose | + | '(rose [[vi]]olet daisy buttercup) |
*データとプログラムのどちらも同じ方法で表現する。どちらも、単語や数やリストを空白で区切って括弧で囲んだリストである。 | *データとプログラムのどちらも同じ方法で表現する。どちらも、単語や数やリストを空白で区切って括弧で囲んだリストである。 | ||
− | <blockquote>リストの直前に付けた1つのアポストロフィ'を | + | <blockquote>リストの直前に付けた1つのアポストロフィ'を クオートと呼び、リストの直前にこれを付けると、そのリストに関しては何もせずに字面どおりに扱うことを[[Lisp]]に指示する。リストの直前にクオートがない場合には、リストの先頭要素を特別扱いし、コンピュータが従うべきコマンドとなる</blockquote> |
===アトム=== | ===アトム=== | ||
44行目: | 44行目: | ||
*特殊な関数があり、これらは普通の方式のように動作しない。これらをスペシャルフォーム(special forms)と呼ぶ。関数の定義などの特殊なことを行うものであり、それらの個数は多くはない。 | *特殊な関数があり、これらは普通の方式のように動作しない。これらをスペシャルフォーム(special forms)と呼ぶ。関数の定義などの特殊なことを行うものであり、それらの個数は多くはない。 | ||
=====ネストしたリスト===== | =====ネストしたリスト===== | ||
− | *インタープリタが探しあてた関数がスペシャルフォームでなく、しかも、それがリストの一部である場合には、 | + | *インタープリタが探しあてた関数がスペシャルフォームでなく、しかも、それがリストの一部である場合には、 [[Lisp]]インタープリタはリストの内側にリストがあるかどうかを調べる。内側にリストがあれば、[[Lisp]]インタープリタは内側のリストを処理してから、外側のリストを処理する。 |
==引数== | ==引数== | ||
===データ型=== | ===データ型=== | ||
58行目: | 58行目: | ||
*letを使う | *letを使う | ||
====setの使い方==== | ====setの使い方==== | ||
− | *シンボルflowersの値としてリスト'(rose | + | *シンボルflowersの値としてリスト'(rose [[vi]]olet daisy buttercup)を設定する |
− | >(set 'flowers '(rose | + | >(set 'flowers '(rose [[vi]]olet daisy buttercup)) |
− | ( | + | ([[R]]OSE VIOLET DAISY BUTTE[[R]]CUP) |
>'flowers | >'flowers | ||
− | + | FLOWE[[R]]S | |
>flowers | >flowers | ||
− | ( | + | ([[R]]OSE VIOLET DAISY BUTTE[[R]]CUP) |
<blockquote>setを使う場合、いずれの引数も評価してほしくない場合には、両方の引数をクオートする必要がある</blockquote> | <blockquote>setを使う場合、いずれの引数も評価してほしくない場合には、両方の引数をクオートする必要がある</blockquote> | ||
77行目: | 77行目: | ||
*setで第1引数をクオートする組み合わせは多用されるので、スペシャルフォームsetqが用意してある | *setで第1引数をクオートする組み合わせは多用されるので、スペシャルフォームsetqが用意してある | ||
*setとほとんど同じであるが、第1引数を自動的にクオートするので、引用符をタイプする必要はない | *setとほとんど同じであるが、第1引数を自動的にクオートするので、引用符をタイプする必要はない | ||
− | >(setq flowers '(rose | + | >(setq flowers '(rose [[vi]]olet daisy buttercup)) |
− | ( | + | ([[R]]OSE VIOLET DAISY BUTTE[[R]]CUP) |
>flowers | >flowers | ||
− | ( | + | ([[R]]OSE VIOLET DAISY BUTTE[[R]]CUP) |
*さらに、setqは、複数の異なる変数に異なる値を代入するためにも使える。 | *さらに、setqは、複数の異なる変数に異なる値を代入するためにも使える。 | ||
>(setq alpha '(a b c) | >(setq alpha '(a b c) | ||
101行目: | 101行目: | ||
===defun=== | ===defun=== | ||
*シンボルには、関数として呼ばれたときにコンピュータが実行するコードが結び付けられている。 | *シンボルには、関数として呼ばれたときにコンピュータが実行するコードが結び付けられている。 | ||
− | *このコードを関数定義(function definition)と呼び、シンボルdefun(define function(関数を定義する)の略)で始まる | + | *このコードを関数定義(function definition)と呼び、シンボルdefun(define function(関数を定義する)の略)で始まる [[Lisp]]の式を評価することで作成する |
*defunは、その引数を通常のようには評価しないので、 スペシャルフォーム(special form)と呼ばれる。 | *defunは、その引数を通常のようには評価しないので、 スペシャルフォーム(special form)と呼ばれる。 | ||
=====書式===== | =====書式===== |
2020年2月16日 (日) 04:20時点における最新版
言語まとめ 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)
- データとプログラムのどちらも同じ方法で表現する。どちらも、単語や数やリストを空白で区切って括弧で囲んだリストである。
<blockquote>リストの直前に付けた1つのアポストロフィ'を クオートと呼び、リストの直前にこれを付けると、そのリストに関しては何もせずに字面どおりに扱うことをLispに指示する。リストの直前にクオートがない場合には、リストの先頭要素を特別扱いし、コンピュータが従うべきコマンドとなる</blockquote>
アトム
- これまで単語と呼んできたものをアトム(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)
<blockquote>setを使う場合、いずれの引数も評価してほしくない場合には、両方の引数をクオートする必要がある</blockquote>
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")
偽について
© 2006 矢木浩人