トップページtech
92コメント28KB

common lispのお勧め参考書を教えてください

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。NGNG
書店を見てまわったんですが、どれが使えるのかわかりません。
0042名無しさん@お腹いっぱい。NGNG
はい
http://www.icot.or.jp/ARCHIVE/HomePage-J.html
0043LISP好き学生NGNG
よく「LISPは人工知能用言語」って言われますよね。
確かに人工知能の分野で主に使われているけど、その為だけの言語ではなく
生産性、汎用性、移植性にすぐれた高級言語です。
コンパイラもあるし、ガベッジコレクションもやってくれる。
多倍長の数値計算も楽々で、分数型もサポートしてるので計算にも
まあ使いやすいと思います。

でも一つ謎なのは、よくLISPが関数型言語と分類付けされてますが、
これってバッカスの発表した関数型プログラミングの事でしょうか?

それとも単に関数を定義していってプログラムを書いていくから関数
型言語と言っているのでしょうか?だとすると、Cも関数型言語なのに
なぜかそうは言われないのが不思議です。


0044名無しさん@お腹いっぱい。NGNG
Cは制御構造がステートメントだから後者の関数型言語でもないです。
0045LISP好き学生NGNG
>44
LISPも制御構造は関数じゃなくて、
スペシャルフォームまたはそのマクロです。
0046名無しさん@お腹いっぱい。NGNG
知ったかぶりばかりしてないで、もうちょっと勉強しましょう>43
0047名無しさん@お腹いっぱい。NGNG
>44
43は
「それとも単に関数を定義していってプログラムを書いていくから関数
型言語と言っているのでしょうか?だとすると、Cも関数型言語なのに
なぜかそうは言われないのが不思議です。」
といってるの。
日本語読める?
004844>45NGNG
なるほど、どうもです。
004944>47NGNG
「関数を定義していってプログラムを書く関数型言語」っていうのに
「Cが」あてはまらない事を書いたんだけど。
あんたこそ、日本語、読める?

005047ではないけどNGNG
>49
44は「だとすると」とわざわざ断ってるから、
そういうことは指摘されなくても承知してるように読めるよ。
005144NGNG
ああ、おれがわるかったよ、ごめんよ。
0052名無しさん@お腹いっぱい。NGNG
LISP が関数型言語で、C は似非関型言語であって、
その関係は、弥が上にも
Java がオブジェクト指向言語で、C++が似非オブジェクト指向言語であることを
連想させる。
005344NGNG
だからもうかんべんしてください。
0054名無しさん@お腹いっぱい。NGNG
しょせんEmacsのマクロ
0055名無しさん@お腹いっぱい。NGNG
真のLisperはZmacsを使う
0056名無しさん@お腹いっぱい。NGNG
eLisp以外のLispは糞
0057名無しさん@お腹いっぱい。NGNG
kekeke>56
0058LISP好き学生NGNG
いろいろな御意見ありがとうございます。
さらにどっかの本で

prologとLISPは人工知能用に使われている論理型言語で…

とのくだりがありました。prologは確かにそんな感じがすると思うん
ですが、LISPはどう考えても「論理型言語」だとは思えません。

この前にCやpascalをまとめて「何とか(忘れましたすみません)型言語」
として、ひとまとめにしている箇所もあり、LISPがCよりpascalに近い
構造の言語である様に記述されています。

LISPはprologよりCに近いと思いますが同でしょうか?
0059LISP好き学生NGNG
58の書き込み訂正です

LISPがCよりpascalに近い構造の言語である様に記述されています。

LISPがCよりprologに近い構造の言語である様に記述されています。
0060元AIエンジニアNGNG
Lispだけで人工知能するわけじゃないです。
私の知っている例で言いますと、Lispペースで以下の様な構成を取ります。
1) 知識表現(フレーム表現)言語をLisp上に構築する
2) 前向き推論エンジン(OPS等)を1)のフレームベースで実装する
3) 後向き推論エンジン(Prolog等)を1)のフレームベースで実装する。
4) 2)と3)の融合(OPSの左辺式にPrologのQuery記述を許すとか)
5) cf値(確信度)やファジー値などの演算ユーティリティを組み込む

0061名無しさん@お腹いっぱい。NGNG
>58
手続き型とか手順型とかでしょうか?
処理の手順を順番に記述するような言語ってことだと思います。
反対に、条件を列挙するような言語を宣言型とか言った気がします。
(くわしい人のつっこみ求む)
0062LISP好き学生NGNG
>61
名前は忘れましたが、
cとpascalが同じ○○型言語
LISPとprologが論理型言語
と区分けしてるのはどう考えても変だな?と思ったので
他の人の意見を聞きたいだけで、○○の部分はべつにどうでも
いいです。
0063LISP好き学生NGNG
>61
多分、手続き型かそんな感じだった気がしますが…
レスつけていただいてありがとうございます。
Cは通常、何型言語と呼ばれてて、どうべばしっくりくるん
でしょうね。
0064LISP好き学生NGNG
>60
後向き推論エンジンをPrologで実装するんじゃなくて、
Prologインタプリタをフレームシステム上に構築するんですか?
この辺り興味しんしんです。
0065名無しさん@お腹いっぱい。NGNG
興味の無い話はどうでもいいからやめろってことか。
0066LISP好き学生NGNG
>65
いや、62の発言は確かにそうとらえられてもしかたない発言だと
送信ボタンを押した瞬間に気づきましてすぐあとにフォローの
つもりで63を書いたのですが、65さんの御意見は誤解です。
58での僕の質問の意図だけはっきりとお伝えするつもりで書いた
のですが、書き方がまずかったと反省しております。すみません。
一般的にどの言語がどのクラスに属するのかは興味がありますので
御意見があれば続けてほしいです。
006760NGNG
>64
Prolog も OPS も Lisp で構築したものです。
速度的にはかなり不利ですが、当時は速度は気にしていませんでしたね(失笑)
Prolog や OPS の処理要素(Prologだとaxionでしたっけ?OPSならWorkingMemory)が
そのままフレームに対応しているのが特徴でした。

現在の状態(事実)をフレーム(オブジェクト)で記述して
例えばその状態から疑われる故障原因を前向き推論で導出する…
候補として挙げられた故障原因を、後ろ向き推論で検証して行く…
そんなことの繰り返しで推論を進めて行く機構でした。
(故障診断システムの例)
0068名無しさん@お腹いっぱい。NGNG
AIといえばドラゴン食えスト4か5くらいからAI機能がついたな。
その他のAIってしらないな。
アイボもあったか・・・
0069LISP好き学生NGNG
>67
フレームで事実を表現するのはやはり、スロット−スロット
値の対ですよね?推論機構は付加手続きとしてスロットに埋め
込むべきなのでしょうか?それともスロットにルールを埋め込
んでおいて、推論機構は外部に構築したほうがいいんでしょうか?
この辺りあんまりいい本見つからなくてどれがいいのか、悪い
いのかよく分かりません。Minskyの論文も実装法は全然書いて
ないし・・・(泣)
やはり手続き的知識はフレームよりルールで表現したほうが
素直だと僕は思うんですが。実装に興味がありますねぇ。
0070>69NGNG
ルール自体はリスト形式での記述でしたね。
そのリストをスロットの値にすることも出来ましたし
メタスロットにルールを持たせて、デーモン的に起動することも可能でした。
0071学生時代AIでバイトNGNG
>デーモン的に起動
if-requiredとかif-added@`if-removedってやつですね。15年前
K-PrologとOPS83でフレームを実装してみたことがあるんですが、
今になって考えると、RDBMSでストアドプロシージャが特定の
トリガで起動するのと、何が違うのかって考えてしまいます。

OPS83は前向き推論ルールが書けるPascalだったので、手続き的なのは仕方が
ないんですが、Prologでも、気が付くとかなりの部分が手続き的なプログラム
になっちゃってました。1万行程度のプログラムをPrologだけで記述すると、
本来のパターンマッチング&バックトラック、リスト処理を生かせる部分って
案外少なかったような気がします。言語仕様上、当然パターンマッチは使うけど、
それはCで書いたif文をProlog流に書き換えただけに過ぎません("\"オペレータの乱用)。
LISPはPrologに比べると遥かに手続き的な言語ですから、なおさら論理型言語
とは言えないでしょう。PROG文の中でループ組めたりもしますからね。

(LISPはウィンストンの教科書読んでFranzLispをちょっといじっただけです
ので、基本的には無知ですが、EmacsLISPを書く手助け程度にはなってます)
0072LISP好き学生NGNG
なるほど、参考になりました。Prologもなんか面白そう
ですね。OPSっていうのは知らないのですが、話を聞いて
るとつまりプロダクションシステムの処理系ですか。
0073LISP好き学生 NGNG
ちょっとCommon Lispでプログラムを組んでるのですが、難問にぶつかりまして
どなたか解るかたおられるでしょうか?

letフォームの中でeval等を用いてS式を評価する際、
let文で束縛されているローカル変数をS式中で参照する方法は
あるのでしょうか?例えば、

>(let ((result 1))
 (eval '(+ 1 result)))
2
としたいのですが。
(上は実際にはresultはグローバルのresultを参照してしまうのです(泣))
0074LISP好き学生 NGNG
(defvar result)とかを前もって宣言しておく、とかしか
ないんでしょうか?S式中で参照するシンボルを事前に知って
おかないと行けないというのが嫌なので…
0075名無しさん@お腹いっぱい。 NGNG
The form is evaluated in the current dynamic environment and a null lexical environment. (CLtL2)
つーことだから、無理やね (^^;)
global-let 使えると楽そうだけど… (ZetaLisp仕様)
0076名無しさん@お腹いっぱい。 NGNG
Scheme なら (eval sexp env) をサポートしてる実装は結構あるけどね。
007776 NGNG
いま Abelson and Sussman の "Structure and Interpretation of Computer Programs" (原著)を
苦労しながら読んでいますが、すでによく知っていると
思っていたことでもいざ読んでみると勉強になりますね。
演習問題を考えていると全然進まないのだった。
0078Lisp好き学生 NGNG
お返事ありがとうございます。やはり無理ですか...。
評価時に環境を得る方法はCommonLispはサポートしてないんですね。
ところでdefmacroの&environmentってどう使うんでしょう?
0079名無しさん@お腹いっぱい。 NGNG
Windows で Common Lisp やってる人,
処理系は何使ってます?
やっぱ,KCL ?
あれは,DOS 版のインタプリタの
使い勝手が悪いんですけど…
キーバインドが自由に決められないとか.
なんか上手い方法あります?
0080名無しさん@お腹いっぱい。 NGNG
>78
コンパイルしたらアクセスできなくなるからな。
どうしてもそういう変なことがしたければ、
スペシャル宣言する手もあるが。

&environmentはマクロの中でマクロ展開する場合などに使う。
0081LISP好き学生 NGNG
>80
お返事ありがとうございます。

>コンパイルしたらアクセスできなくなるからな。
起動中の他の関数のローカル変数を参照するような
仕様のコンパイラは作成し難いという意味でしょうか?

あと、たとえば
(defmacro foo (&environment x) ...)
と定義されたマクロ foo にはどんな引数を与えるんでしょう?
勝手にxにシステム側が展開される場所の変数束縛リストを
バインドするのでしょうか?するとそれに対するアクセスは
assocを用いて行うのですかね。
0082名無しさん@お腹いっぱい。 NGNG
>起動中の他の関数のローカル変数を参照するような
>仕様のコンパイラは作成し難いという意味でしょうか?

つーかね、言語仕様でそう決まっているから、
アクセスできるようにする必要がないってこと。
なぜ、そういう言語仕様なのかというと、
そのほうが効率がいいからだな。
具体的には、外部からアクセスする必要がなければ、
その変数はレジスタに乗せることができるわけだ。

動的スコープを持つようにコンパイルするのは別に難しいことではない。
現に、すべてのCommon Lisp処理系は、specialと宣言された変数束縛を
動的スコープを持つようにコンパイルすることができる。

>(defmacro foo (&environment x) ...)
>と定義されたマクロ foo にはどんな引数を与えるんでしょう?
>勝手にxにシステム側が展開される場所の変数束縛リストを
>バインドするのでしょうか?

システムが勝手に環境オブジェクトをバインドする。
バインドされるのは変数束縛リストではない。

>するとそれに対するアクセスはassocを用いて行うのですかね。

環境オブジェクトの構造は処理系依存であるため、
assocでアクセスできるかもしれないし、
まったくアクセスできないかもしれない。

&environmentは、マクロの中でmacroexpandを呼んだ際に、
macroletで定義されたマクロを展開できるように
macroexpandの第二引数に与えるためのものであって、
おそらくキミの期待するものではないだろう。
0083LISP好き学生 NGNG
>82
ふむふむ。なるほど、わかりました。動的スコープを持つように
コンパイルする事は可能だと思ってたので不思議に思ったので
すが、具体的なご説明有り難うございます。
すると、スペシャル変数をあまり多用すると、ローカル変数で処理
した場合処理と比べて実行速度が遅くなる可能性が高いみたい
ですね。勉強になりました。
あと、&environmentで無理矢理なんとかできないのかと思いま
したが(やっぱり)無理みたいですね。
0084LISP好き学生 NGNG
問題が(かなり強引な方法ですが…)解決しました。

(defmacro macro-eval (s-exp)
 `(progn
  (eval `(defmacro temp-macro () '@`@`s-exp))
  (temp-macro)))

というようなマクロを用いればローカル変数をスコープにいれた状態
でS式を評価出来ました。以下実行例です。
----------------------------------------
>(setq s-exp '(print x))
(print x)

>(setq x 10)
10

>(let ((x 5))
  (eval s-exp)
  (macro-eval s-exp))

10
5
5
----------------------------------------
では。
0085名無しさん@お腹いっぱい。 NGNG
>84
それをコンパイルしたら、期待する動きにはならないと思いますが、
こだわりません。
0086LISP好き学生 NGNG
>85
いえ、確かコンパイル後も動きますよ。
(GNUCommonLispとCLISPで確認済)
以下GCL(ver.2.2.2)での実行例
----------------------------------------
>(defun foo (s-exp)
  (let ((x 5))
   (eval s-exp)
   (macro-eval s-exp)))

FOO

>(setq x 10)
10

>(foo '(print x))

10
5
5

>(compile 'foo)
Compiling gazonk0.lsp.
End of Pass 1.
End of Pass 2.
OPTIMIZE levels: Safety=0 (No runtime error checking)@` Space=0@` Speed=3
Finished compiling gazonk0.lsp.
Loading gazonk0.o
start address -T 829e76c Finished loading gazonk0.o
#<compiled-function FOO>

>(foo '(print x))

10
5
5
----------------------------------------
0087名無しさん@お腹いっぱい。 NGNG
CLISPでの実行例
----------------------------------------
[2]> (defun foo (s-exp)
    (let ((x 5))
     (eval s-exp)
     (macro-eval s-exp)))
FOO
[3]> (setq x 10)
10
[4]> (foo '(print x))

10
5
5
[5]> (compile 'foo)
FOO ;
NIL ;
NIL
[6]> (foo '(print x))

10
5
5
----------------------------------------
0088LISP好き学生 NGNG
まあ、マクロを2回展開(2回目に展開されるマクロは1度目のマクロ
展開後に動的に定義される)するだけなのですので、仕様上は大丈
夫かと。(かなり兇悪ですな…(^^;)
0089名無しさん@お腹いっぱい。 NGNG
そのあとで、
(foo '(print (+ x 1)))
を評価すると、
11
5
5
が得られると思いますが、
それでいいなら何も言うことはありません。
0090 LISP好き学生 NGNG
>89
え?本当ですか。
0091LISP好き学生 NGNG
なるほど、確かにコンパイル後はうまくいきませんね。
あがいても無駄だった様です。
0092名無しさん@お腹いっぱい。 NGNG
湯浅太一、萩谷昌巳のCommon Lisp入門(岩波書店)
は分かり易い。
■ このスレッドは過去ログ倉庫に格納されています