【入門】Common Lisp その4【質問よろず】
AST出力用という意味なら、lispにはプリプロセッサ不要。
敢えて言うなら人間w
939 :
935:2008/06/29(日) 23:27:28
>>936 いや、javaでlispを作りたいなと思って質問しただけです。
普通のパターン
字句解析→プリプロセッサ→構文解析
lispのパターン
字句解析→構文解析→リーダーマクロ
こんな感じでしょうか?javaしかやってない俺には違和感ありまくりです。
括弧は好きなんですけど、CLOSには疑問を感じる。
プリプロセッサは、字句解析の前段でしょ
> 普通のパターン
> 字句解析→プリプロセッサ→構文解析
こっちに違和感ありまくりだよ。
どこで習ったんだ?
プリじゃなくなってるよな。
>>935なら、まずはLispについてちゃんと学んでみるってのはどうかな?
詳細は実装依存な部分もあるけど、ほとんどのLispではコンパイルする時、
まずリーダーがテキストを読み取って内部表現を作る。
リーダーはプログラマブルになっていて、その際にマクロが使える。
これがリーダーマクロだが、正直なとこプリプロセッサとは随分違う。リテラルのユーザー拡張みたいなもん。
それをコンパイラがコンパイルするわけだが、その際にマクロを使って構文木を変換する。
これも構文木(S式ベース)の変換なのでやっぱりCの#defineみたいなテキストベースの
プリプロセッサとは名前以外にほとんど共通点はない。
>>939 リードマクロのマクロと、defmacroのマクロは違うぞ。
前者はコンピュータ一般用語の「マクロ」。
マクロ命令とかマクロアセンブラとかCのマクロなどの。
Lispをもっと勉強しないと処理系作成は無理。
まずLispプログラムをたくさん書いてください。
939さんにつっこんだけど、彼は見込みがあると思うから頑張っていただきたいです
とりあえず、C的なプリプロセッサを搭載したLISP方言を書いてみては
オモチャならすぐ書けるだろ。入門スレであんまり脅かすなよ。
ただ、確かにオモチャの評価器を作っただけでモノにした気分にならなければ
でも、CLOSに疑問といいながら処理の理解があいまいとか知識がちぐはぐだな。
一体どんな経緯で入門してきたんだろう。
947 :
939:2008/06/30(月) 01:03:01
>>943 理解できました。
マクロを実行する前に構文解析すると大問題ですよね。on Lispもかじっていたのに、おおぼけしました。
すみませんでした。
lispのパターン
構文木作成→リーダーマクロ→構文解析
しかもいろいろ勘違いが多くて、javaのimport文もプリプロセッサではないらしいです。
lispのload-libraryと似たような感じらしいです。
いろいろ勘違いもありましたが、lispにプリプロセッサがいらないという事はよく理解できました。
ありがとうございました。
948 :
944:2008/06/30(月) 01:04:14
943へのレスでした。
すみません。
949 :
948:2008/06/30(月) 01:19:07
ボケボケですみません。
948は誤爆です。すみません。
>>944 939です。
>リードマクロのマクロと、defmacroのマクロは違うぞ。
そうなんですか。お恥ずかしい限りです。
javaしかしらない私か、コンピュータ一般用語の「マクロ」を理解するのはしばらく時間がかかりそうです。
>>947 > 構文木作成→リーダーマクロ→構文解析
全部一緒にやるのがLisp風。
リーダーが読んだ結果がもう構文木なんで、構文解析なんてフェーズはないよ。
まずJavaから頭を離すほうがいいんじゃないか。違う概念を知ってる概念に無理矢理当てはめるのはこの場合理解の妨げになるかも。
リーダーがテキストを読み取る時に使われるのがリーダーマクロ/リードマクロなので、
構文木作成の後というより前だろう。構文木ができた時にはすでに解釈・展開されてる。
lispのマクロが究極的に自由すぎて非一般的なんだけどね
んなこたーない。所詮S式ベースの変換だろ。しかも変換に使うのもLispだし。
式とか構文とか、そもそもC言語とかにとらわれないCとかのプリプロセッサのほうが自由とも言える。
…自由だから嬉しいというものではないけどな。
うーん?
レンタルサーバーでcommon lisp動かしたいのですが
makeするしか方法ないのでしょうか?
鯖缶に確認した方が早いし確実。
用意してあるサーバーもあったけどね。CL処理系はCGIにはあんまり向かないからね。
Gaucheとか入ってるサーバー探すほうがはやいかも。
>>955 それ以外の方法はいくらでもある。ただし、
>>957の意見が現実を表してるかな。
どれも細かな問題を抱えるからね。clispはcffi関連のライブラリが扱いづらかったり
cmuclはスクリプトを扱うのに一手間がいる上で日本語に問題があったり、sbclは占
有するメモリが大きかったり。
利用しているサーバーのディストリビューション、バージョンなどがわかれば、それ次第で
仮想環境を構築してそれぞれに合う処理系をビルドするといいですね。
オレはxreaとzmxにGauche入れて使ってる。
cgiとしてなら大抵の言語を使えるんだけど、Lispはそうやって使うもんじゃないよなぁ…
そう言われると使いたくなるな。
>>960 取り合えず頑張ってくれ。ちょっと動かすくらいなら大丈夫だから。
>>957 そんなのあるのか?>Gaucheとか入ってるサーバー
さがせばあるんじゃない? ひとつぐらい。
あるかどうか知らないけど、入れるのは難しくはない。
仮想環境さえつくれればね。そう、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から仮想環境のユーザーに変えた
ほうが扱い易い。
965 :
959:2008/07/04(金) 00:31:15
オレはWindows上でクロスコンパイルした。
たぶんECLくらいならインストールはそれほど難しくはないと思うけど、
gclとかあたりになると仮想環境作った方がやりやすいかもしんない。
>>965 実はcmuclは本家からlinux i386のバイナリを取ってきて、xreaのホームディレクトリで
展開すれば動くんですよね。スクリプトとして動作させようとすれば、
http://rpw3.org/hacks/lisp/ の
site-switch-script.lispを使う必要があるって事がめんどいだけなんです。ただし、
日本語の取扱いは期待できない処理系なんですがね。
また、clispはfast cgiに対応したパッケージも提供しているから、一応cgiを想定してい
るようです。4Mの空きメモリさえあれば動くからwebならclispが扱いやすいと考えてい
ますね。
dreamhostはx86_64のdebianらしくてi386の仮想環境なら作れるが
x86_64って作れたのか
複数回評価するマクロを作ろうとしているのですが、
教えて頂けないでしょうか
具体的には
(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は、実質全く同じものと思っていても良いでしょうか
>>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))))))
ほぼ自己解決しました。
マクロはもしかすると自分が思っていたようなものとは少し違うのかもしれません
(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に束縛がないとエラー」、です。
>>969 おお、レスがついてた、ありがとうございます。
>マクロは略記法を作ることしかできない
なるほど。
lamdaで包む方法なんて思いつきませんでした。
まだ慣れていないのでできるかはわからないですが
これを展開形として、マクロ化できるか、練習として考えてみます。
あまりマクロの利点は感じられない感じのコードですが
関数そのままに、こんな感じになりました。
(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では呼び出せないんですね
CLISPで日本語ファイル名は扱えますか?
WinXPSP3で使っています。
rename-fileを使って連番ファイルを日本語名に一括して変換したいと思ってます。
xyzzyではできていました。
日本語文字列をファイルに出力することはできているので、
元々ファイル名では日本語に対応してないと考えるべきでしょうか?
clisp+emacs+slime+ltkの導入だけで3日かかりました。
ググったり、Webarchivesからサルベージしてもまとまったインストールの解説ってないものですね。
この苦労はLisp始めようしたら必ず通る道なんでしょうか?
それともWinだから?
>>973 utf8の日本語名なら使えるよ。(ubuntuのclispで確認。)
でもね。。。日本語ファイル名は基本的に避けた方がいいよ。
>>973 OSによって導入格差はあるよ。
たとえば、
carbonemacsなんて標準でslimeが付いてくるくらいなのでsbclを本家から取ってきてinstall.shを
実行して、すこしslimeようの記述を.emacsにすればおしまいだけどね。
windowsは.emacsの設定からちょっと悩むところがあるかもしれない。インストールログを
公開しておくと後々に自身も含めてみんな助かるよ。
976 :
973:2008/07/10(木) 23:35:11
レスありがとうございます。
>>974 xyzzyでutf8のファイル(ファイル名は英語)を作って読み込ませたところ、
これは Invalid multibyte or wide character で読めなかったです。
Clispは2.46を使ってます。
日本語の扱いは難しい…
日本語ファイル名はやめた方がいいかもですね。
でも、もうちょっと色々やってみます。
>>975 うわ格差かぁ…
インストールメモを忘れないうちに書いておきます。
.emacsのslime設定もネットのをコピペして、ディレクトリパスを書き換えだけでは動かず、
エラー部分をコメントアウトしながらslimeが動くようにしてます。
コメントアウトした部分は必要になるかもと思うと消せませんし。
動いてるからいいよねって、手探り状態です。
>>976 私もWindows環境でCLISP+Emacs+SLIMEを導入するのにかなり手こずりました。(´・ω・`)
CLISPの最近のverではSLIMEがうまく起動せず、古いverをいろいろ試して、
clisp-2.41-win32-with-readline-and-gettext.zip というやつでやっとエラーが出ずにSLIMEが動きました。
>>976 うん。windowsでの大きな違いがパス表現なのね。これが一番凶悪。
日本語にこだわらなければ学習目的ならば商用系が比較的楽なんだけどね。
slimeからaclを使うって方法もあるけど、この情報もあまり整備されてないね。
いずれにしてもwindowerさんたちがlispを始めるときはxyzzy以外はどこかに
帯に短し襷に長しを経験していると思うかな。他から始める人よりヘトヘトに
なってから始めることになる。
本格的にlispを使おうと思うならば、将来的にlinuxへの移行も検討したほうが
何かと楽になりますね。
Lispboxは使わんのかね諸君
>>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で遊んでみようかな。
前から気になってんスけど「ゆっくりたりましょう」って何。パワーズって誰?
ついでにスレタイ【気持ち悪い】から
「Common Lisp質問スレその5」がいいのでは。
ま、ゆっくり立てていってね!!!
>>990
(make-thread :name common-lisp :part 5)