【入門】Common Lisp その4【質問よろず】

このエントリーをはてなブックマークに追加
938デフォルトの名無しさん:2008/06/29(日) 16:46:16
AST出力用という意味なら、lispにはプリプロセッサ不要。
敢えて言うなら人間w
939935:2008/06/29(日) 23:27:28
>>936
いや、javaでlispを作りたいなと思って質問しただけです。

普通のパターン
 字句解析→プリプロセッサ→構文解析

lispのパターン
 字句解析→構文解析→リーダーマクロ

こんな感じでしょうか?javaしかやってない俺には違和感ありまくりです。
括弧は好きなんですけど、CLOSには疑問を感じる。
940デフォルトの名無しさん:2008/06/29(日) 23:51:00
プリプロセッサは、字句解析の前段でしょ
941デフォルトの名無しさん:2008/06/30(月) 00:13:04
> 普通のパターン
>  字句解析→プリプロセッサ→構文解析

こっちに違和感ありまくりだよ。

どこで習ったんだ?
942デフォルトの名無しさん:2008/06/30(月) 00:23:16
プリじゃなくなってるよな。
943デフォルトの名無しさん:2008/06/30(月) 00:30:38
>>935なら、まずはLispについてちゃんと学んでみるってのはどうかな?

詳細は実装依存な部分もあるけど、ほとんどのLispではコンパイルする時、
まずリーダーがテキストを読み取って内部表現を作る。
リーダーはプログラマブルになっていて、その際にマクロが使える。
これがリーダーマクロだが、正直なとこプリプロセッサとは随分違う。リテラルのユーザー拡張みたいなもん。

それをコンパイラがコンパイルするわけだが、その際にマクロを使って構文木を変換する。
これも構文木(S式ベース)の変換なのでやっぱりCの#defineみたいなテキストベースの
プリプロセッサとは名前以外にほとんど共通点はない。
944デフォルトの名無しさん:2008/06/30(月) 00:47:39
>>939
リードマクロのマクロと、defmacroのマクロは違うぞ。
前者はコンピュータ一般用語の「マクロ」。
マクロ命令とかマクロアセンブラとかCのマクロなどの。

Lispをもっと勉強しないと処理系作成は無理。
まずLispプログラムをたくさん書いてください。
945デフォルトの名無しさん:2008/06/30(月) 00:51:59
939さんにつっこんだけど、彼は見込みがあると思うから頑張っていただきたいです
とりあえず、C的なプリプロセッサを搭載したLISP方言を書いてみては
946デフォルトの名無しさん:2008/06/30(月) 00:56:10
オモチャならすぐ書けるだろ。入門スレであんまり脅かすなよ。
ただ、確かにオモチャの評価器を作っただけでモノにした気分にならなければ

でも、CLOSに疑問といいながら処理の理解があいまいとか知識がちぐはぐだな。
一体どんな経緯で入門してきたんだろう。
947939:2008/06/30(月) 01:03:01
>>943
理解できました。
マクロを実行する前に構文解析すると大問題ですよね。on Lispもかじっていたのに、おおぼけしました。
すみませんでした。

lispのパターン
 構文木作成→リーダーマクロ→構文解析

しかもいろいろ勘違いが多くて、javaのimport文もプリプロセッサではないらしいです。
lispのload-libraryと似たような感じらしいです。
いろいろ勘違いもありましたが、lispにプリプロセッサがいらないという事はよく理解できました。
ありがとうございました。
948944:2008/06/30(月) 01:04:14
943へのレスでした。
すみません。
949948:2008/06/30(月) 01:19:07
ボケボケですみません。
948は誤爆です。すみません。

>>944
939です。
>リードマクロのマクロと、defmacroのマクロは違うぞ。
そうなんですか。お恥ずかしい限りです。
javaしかしらない私か、コンピュータ一般用語の「マクロ」を理解するのはしばらく時間がかかりそうです。
950デフォルトの名無しさん:2008/06/30(月) 01:22:48
>>947
>  構文木作成→リーダーマクロ→構文解析

全部一緒にやるのがLisp風。
951デフォルトの名無しさん:2008/06/30(月) 01:23:38
リーダーが読んだ結果がもう構文木なんで、構文解析なんてフェーズはないよ。
まずJavaから頭を離すほうがいいんじゃないか。違う概念を知ってる概念に無理矢理当てはめるのはこの場合理解の妨げになるかも。
リーダーがテキストを読み取る時に使われるのがリーダーマクロ/リードマクロなので、
構文木作成の後というより前だろう。構文木ができた時にはすでに解釈・展開されてる。
952デフォルトの名無しさん:2008/06/30(月) 01:23:40
lispのマクロが究極的に自由すぎて非一般的なんだけどね
953デフォルトの名無しさん:2008/06/30(月) 01:26:37
んなこたーない。所詮S式ベースの変換だろ。しかも変換に使うのもLispだし。
式とか構文とか、そもそもC言語とかにとらわれないCとかのプリプロセッサのほうが自由とも言える。
…自由だから嬉しいというものではないけどな。
954デフォルトの名無しさん:2008/07/01(火) 15:01:01
うーん?
955デフォルトの名無しさん:2008/07/02(水) 08:41:29
レンタルサーバーでcommon lisp動かしたいのですが
makeするしか方法ないのでしょうか?
956デフォルトの名無しさん:2008/07/02(水) 18:05:47
鯖缶に確認した方が早いし確実。
957デフォルトの名無しさん:2008/07/02(水) 20:26:06
用意してあるサーバーもあったけどね。CL処理系はCGIにはあんまり向かないからね。
Gaucheとか入ってるサーバー探すほうがはやいかも。
958デフォルトの名無しさん:2008/07/02(水) 20:51:49
>>955
それ以外の方法はいくらでもある。ただし、>>957の意見が現実を表してるかな。
どれも細かな問題を抱えるからね。clispはcffi関連のライブラリが扱いづらかったり
cmuclはスクリプトを扱うのに一手間がいる上で日本語に問題があったり、sbclは占
有するメモリが大きかったり。

利用しているサーバーのディストリビューション、バージョンなどがわかれば、それ次第で
仮想環境を構築してそれぞれに合う処理系をビルドするといいですね。
959デフォルトの名無しさん:2008/07/02(水) 21:29:26
オレはxreaとzmxにGauche入れて使ってる。
cgiとしてなら大抵の言語を使えるんだけど、Lispはそうやって使うもんじゃないよなぁ…
960デフォルトの名無しさん:2008/07/02(水) 22:16:18
そう言われると使いたくなるな。
961デフォルトの名無しさん:2008/07/02(水) 22:24:03
>>960
取り合えず頑張ってくれ。ちょっと動かすくらいなら大丈夫だから。
962デフォルトの名無しさん:2008/07/03(木) 08:15:48
>>957
そんなのあるのか?>Gaucheとか入ってるサーバー
963デフォルトの名無しさん:2008/07/03(木) 10:43:12
さがせばあるんじゃない? ひとつぐらい。
964デフォルトの名無しさん:2008/07/03(木) 20:12:43
あるかどうか知らないけど、入れるのは難しくはない。
仮想環境さえつくれればね。そう、virtualboxを導入して、利用しているサーバーのOS
に合わせたものを作ってしまえば良い。

別スレに誤爆したけど、そのコメントを少し
gaucheをxrea

・仮想環境にopenSUSE 10.3/11.0 i386版をインストール
・ディレクトリ /virtual/(xreaのあなたのID)/ を作る。
・そのディレクトリの下に bin lib share ディレクトリを作る。
・gaucheのソースを本家からダウンロード&展開
・gauche-0.8.xxディレクトリに移動
・./configure --prefix=/virtual/(xreaのあなたのID)/
・make
・make install
・/virtual/(xreaのあなたのID)/に移動
・ tar cjvf gauche.tar.bz2 bin lib share
・ gauche.tar.bz2 を xrea に持っていく。
・ sshでxreaにつなぐ
・ そこで tar xjvf gauche.tar.bz2 とする。

おしまい。openSUSEにはyastからautomake autoconf など開発系のパッケージを入れること。
仮想環境で/vurtual/(xrea id)/を作るときにchownでrootから仮想環境のユーザーに変えた
ほうが扱い易い。
965959:2008/07/04(金) 00:31:15
オレはWindows上でクロスコンパイルした。
たぶんECLくらいならインストールはそれほど難しくはないと思うけど、
gclとかあたりになると仮想環境作った方がやりやすいかもしんない。
966デフォルトの名無しさん:2008/07/04(金) 07:44:39
>>965
実はcmuclは本家からlinux i386のバイナリを取ってきて、xreaのホームディレクトリで
展開すれば動くんですよね。スクリプトとして動作させようとすれば、
http://rpw3.org/hacks/lisp/

site-switch-script.lispを使う必要があるって事がめんどいだけなんです。ただし、
日本語の取扱いは期待できない処理系なんですがね。

また、clispはfast cgiに対応したパッケージも提供しているから、一応cgiを想定してい
るようです。4Mの空きメモリさえあれば動くからwebならclispが扱いやすいと考えてい
ますね。
967デフォルトの名無しさん:2008/07/06(日) 23:50:49
dreamhostはx86_64のdebianらしくてi386の仮想環境なら作れるが
x86_64って作れたのか
968デフォルトの名無しさん:2008/07/10(木) 13:15:52
複数回評価するマクロを作ろうとしているのですが、
教えて頂けないでしょうか

具体的には
(setq a 'b b 'c c 'd)
この状態で、(s a)を実行後Aを評価するとcやdを返すようなマクロsを定義したい。
aとbを返す版は作れました
a版1:(defmacro s(x) (setq A x))
a版2:(defmacro s(x) `,(setq A x))
b版:(defmacro s(x) `(setq A ,x))
こんな感じのコードを試してみましたがcではなく、bや一部が評価された版が返ってきます
(defmacro s(x) `(setq A ,`,x))
(defmacro s(x) ``(setq A ,,x))

また、a版1とa版2は、実質全く同じものと思っていても良いでしょうか
969デフォルトの名無しさん:2008/07/10(木) 14:14:44
>>968
マクロは略記法を作ることしかできない。
まずマクロを使わない場合を考えろ。

場合によるがquoteではなくlambdaで包むのが正しいかもしれない。
(progn
(setq a (lambda () b))
(setq b (lambda () c))
(setq c (lambda () d))
(setq d 'd-value)
(and
(eq b (funcall a))
(eq c (funcall (funcall a)))
(eq d (funcall (funcall (funcall a))))))
970デフォルトの名無しさん:2008/07/10(木) 14:18:15
ほぼ自己解決しました。
マクロはもしかすると自分が思っていたようなものとは少し違うのかもしれません

(setq a 'b b 'c c 'd)
;それぞれ、b,c,dが結果として返る
(defmacro s(x) `(setq A ,x))
(defmacro s(x) `(setq A (symbol-value ,x)))
(defmacro s(x) `(setq A (symbol-value (symbol-value ,x))))
(s a)

それと、すみません、xに束縛があったため、968の結果はバグってました。
a版1やa版2はそれぞれ「bが返る」、「xに束縛がないとエラー」、です。
971デフォルトの名無しさん:2008/07/10(木) 14:24:42
>>969
おお、レスがついてた、ありがとうございます。

>マクロは略記法を作ることしかできない
なるほど。
lamdaで包む方法なんて思いつきませんでした。
まだ慣れていないのでできるかはわからないですが
これを展開形として、マクロ化できるか、練習として考えてみます。
972デフォルトの名無しさん:2008/07/10(木) 14:53:22
あまりマクロの利点は感じられない感じのコードですが
関数そのままに、こんな感じになりました。
(setq a (lambda () b)
b (lambda () c)
c (lambda () d)
d 'dvalue)
(defmacro s1(x) `(funcall ,x))
(defmacro s2(x) `(funcall (s1 ,x)))
(defmacro s3(x) `(funcall (s2 ,x)))
(defun f1(x) (funcall x))
(defun f2(x) (funcall (f1 x)))
(defun f3(x) (funcall (f2 x)))

(s3 a)
(f3 a)

ちょっとした違いというか
マクロ版は、funcallでは呼び出せないんですね
973デフォルトの名無しさん:2008/07/10(木) 20:54:45
CLISPで日本語ファイル名は扱えますか?
WinXPSP3で使っています。
rename-fileを使って連番ファイルを日本語名に一括して変換したいと思ってます。
xyzzyではできていました。
日本語文字列をファイルに出力することはできているので、
元々ファイル名では日本語に対応してないと考えるべきでしょうか?

clisp+emacs+slime+ltkの導入だけで3日かかりました。
ググったり、Webarchivesからサルベージしてもまとまったインストールの解説ってないものですね。
この苦労はLisp始めようしたら必ず通る道なんでしょうか?
それともWinだから?
974デフォルトの名無しさん:2008/07/10(木) 22:21:57
>>973
utf8の日本語名なら使えるよ。(ubuntuのclispで確認。)

でもね。。。日本語ファイル名は基本的に避けた方がいいよ。
975デフォルトの名無しさん:2008/07/10(木) 22:25:00
>>973
OSによって導入格差はあるよ。
たとえば、
carbonemacsなんて標準でslimeが付いてくるくらいなのでsbclを本家から取ってきてinstall.shを
実行して、すこしslimeようの記述を.emacsにすればおしまいだけどね。

windowsは.emacsの設定からちょっと悩むところがあるかもしれない。インストールログを
公開しておくと後々に自身も含めてみんな助かるよ。
976973:2008/07/10(木) 23:35:11
レスありがとうございます。

>>974
xyzzyでutf8のファイル(ファイル名は英語)を作って読み込ませたところ、
これは Invalid multibyte or wide character で読めなかったです。
Clispは2.46を使ってます。
日本語の扱いは難しい…
日本語ファイル名はやめた方がいいかもですね。
でも、もうちょっと色々やってみます。

>>975
うわ格差かぁ…
インストールメモを忘れないうちに書いておきます。
.emacsのslime設定もネットのをコピペして、ディレクトリパスを書き換えだけでは動かず、
エラー部分をコメントアウトしながらslimeが動くようにしてます。
コメントアウトした部分は必要になるかもと思うと消せませんし。
動いてるからいいよねって、手探り状態です。
977デフォルトの名無しさん:2008/07/10(木) 23:47:58
>>976
私もWindows環境でCLISP+Emacs+SLIMEを導入するのにかなり手こずりました。(´・ω・`)
CLISPの最近のverではSLIMEがうまく起動せず、古いverをいろいろ試して、
clisp-2.41-win32-with-readline-and-gettext.zip というやつでやっとエラーが出ずにSLIMEが動きました。
978デフォルトの名無しさん:2008/07/10(木) 23:52:23
Windowsないんで試せないけど、*pathname-encoding* を charset:cp932 とかに
すればいいんじゃね?でも二バイト目問題で完全サポートは無理っぽい?
http://lispuser.net/commonlisp/clisp.html#sec-14
979デフォルトの名無しさん:2008/07/11(金) 05:52:22
>>976
うん。windowsでの大きな違いがパス表現なのね。これが一番凶悪。
日本語にこだわらなければ学習目的ならば商用系が比較的楽なんだけどね。
slimeからaclを使うって方法もあるけど、この情報もあまり整備されてないね。

いずれにしてもwindowerさんたちがlispを始めるときはxyzzy以外はどこかに
帯に短し襷に長しを経験していると思うかな。他から始める人よりヘトヘトに
なってから始めることになる。

本格的にlispを使おうと思うならば、将来的にlinuxへの移行も検討したほうが
何かと楽になりますね。
980デフォルトの名無しさん:2008/07/11(金) 08:52:26
Lispboxは使わんのかね諸君
981デフォルトの名無しさん:2008/07/11(金) 09:48:17
>>979
Linux使いの俺が言うのも何だが、
Linuxをインストールする前に、まずはvmplayerをお勧めします。
あっという間に試せます。
http://itpro.nikkeibp.co.jp/article/COLUMN/20080519/302665/
982デフォルトの名無しさん:2008/07/11(金) 13:40:18
983デフォルトの名無しさん:2008/07/11(金) 23:43:56
>>977
バージョンの違いって影響しますね。
私はltkがActiveTcl8.5では動かず、ググったりドキュメントを読みながら
ActiveTcl8.4を使うことに行き着いてやっと動かすことができました。

>>978
*pathname-encoding*は既に
#<ENCODING "CP932" :DOS>
と設定されてました。
*terminal-encoding*も同様でした。
UTF-8を試してみたいけど、マニュアルに設定はconfig.lispを書いて、
memory_imageを作りなおせってあるが、せっかく動いてるのに怖くて出来ないorz
そもそもconfig.lispにどう書いたらいいかも分かってませんし。

>>979
ええ、ヘトヘトです。しかもまだ始まってもないような…
でもLISPとEmacsについて調べてたらxyzzyが分かってきて、楽しいです。

>>980
slimeの設定を探してた時、このスレの>>108でlispboxは知ったんですけど、
もう意地になって一つずつインストールしてました。

>>981
LinuxはDebianで一度挫折してます。
メモリ512MBのPCなんで仮装マシンは無理だと考えてました。
その記事によると使えそうですし、vmplayer+ubuntuで遊んでみようかな。
984デフォルトの名無しさん:2008/07/12(土) 09:33:47
立てられなかったので、次スレよろ。>>985


lispを触ってみたい入門者のQ&A
初心者のQ&A
本スレでは恥ずかしくて聞けない人のQ&A
本スレは高度すぎて割り込めない人のQ&A
linuxでなくてwindowsでやりたいんですが・・・Q&A
lispを使用してC#やJAVAの代替にするための方法(おまけ)

ま、ゆっくりたりましょう。

「いいものの本質は、いかなる時代においても変わらない」byパワーズ

(list
(url http://pc8.2ch.net/test/read.cgi/tech/1101386936/l50 :part 1)
(url http://pc11.2ch.net/test/read.so/tech/1140012484/l50 :part 2)
(url http://pc11.2ch.net/test/read.so/tech/1181479267/l50 :part 3)
(url http://pc11.2ch.net/test/read.cgi/tech/1201402366/l50 :part 4))
985デフォルトの名無しさん:2008/07/12(土) 11:50:59
前から気になってんスけど「ゆっくりたりましょう」って何。パワーズって誰?
ついでにスレタイ【気持ち悪い】から
「Common Lisp質問スレその5」がいいのでは。

ま、ゆっくり立てていってね!!!>>990
986デフォルトの名無しさん:2008/07/12(土) 12:41:30
(make-thread :name common-lisp :part 5)
987デフォルトの名無しさん