#こんにちは、cclでの質問です
#ccl 1.7/1.8で
#(defconstant foo-obj (list nil))
(eval-when (:compile-toplevel :load-toplevel :execute)
(defun foo-obj-p (obj)
(eq foo-obj obj)))
#みたいなものをファイルに書いて、コンパイル→ロードし
#(compile-file "eq-test.lisp")
(load *)
#定義された関数を評価すると
#(foo-obj-p foo-obj)
;=> NIL
#こんなことになります。Tが返ってくることを期待しててSBCL/Allegro等では実際Tになるのですが、これってどういうことなのでしょう (ANSI CL的には合法、CCLの既知の問題、えー、うちの環境じゃTだけどなーetc〜)
#実際的なところでは、eofをdefconstantかなにかで作って、(defun eof? (obj) (eq +eof+ obj))みたいな関数と組み合わせるような場合に、あれ?ということになります
#(let ((foo-obj (list nil)))
(defun foo-obj ()
foo-obj)
(defun foo-obj-p (obj)
(eq foo-obj obj)))
#みたいなものにしておけばOKですが…
#LispWorksはT返します。
#ちなみにSBCLの場合は、定数の再定義で警告になりますので上書きした場合です。(もしくは、コンパイルしただけで、ロードはしないで試す)
#ありがとうございます > LispWorksではT
#ccl1.7 fx64fslではnilです
#freebsd 64bit版すね
#なるほど、ありがとうございます! 自分の環境は64bit linuxでccl 1.7/1.8でした
#自分はまだ試してないんですが、(break)を関数の中に突っ込んで、SLIMEのインスペクタでオブジェクトを調べると、アドレスが違ってませんか?
#CCLは文字列とかも警告なしで繰り返しdefconstantできたはず。
#あ、すいません書いてなかったですが、%ADDRESS-OFでみるとアドレスは変わってます
#ので、eqはnilになりますね
#ロード時とコンパイル時で2回定義されちゃってるというのが有力でしょうか
#だと思います。
#関連したところなんですが、eval-when :compile-toplevelが付いてるのに、コンパイルしても、foo-objも、foo-obj-pも定義されてない、っぽいんですよね
#これは、そう見えるだけで、実際には定義されてるんでしょうか
#> (foo-obj-p foo-obj)
NIL
> (lisp-implementation-version)
"Version 1.8-r15286M (WindowsX8632)"
#定義されてないってのは、compile-file後ですか?
#ちなみに、全然急いでませんので、なにか思い付いたら書き込んでみてください :)
#compile-file後ですね。SBCLだとcompile-fileすると定義されるみたいです
#compile-fileだけだと、それを参照できるかどうかは処理系依存じゃありませんでしたっけ?
#なるほど、自分は評価されるものだと思ってましたが、そうかもしれませんね
##> Normally, the top level forms appearing in a file compiled with compile-file are evaluated only when the resulting compiled file is loaded, and not when the file is compiled.
#この辺なのかな?
#(compile-file file :load-after-compile t) っていつもしてるけど、:load-after-compileってANSIだったっけ?
#あ、自分はAllegroCLですが。
#HyperSpecには載ってないみたいです。
#じゃあAllegroCLの拡張かあ。
#なるほど、allegroでもそのままではロードされるまで評価されてないですね
#ふむふむ。
#ああ、でもCCLにもloadとかいうそれっぽいキーワード引数ありますね。
#SBCLは、上の3.2.3 File Compilationをストレートに解釈してて、結果として2回評価、CCLとかAllegroは、利用時に便利なように解釈を変えてて、オプションで選択できたり、って感じなんですかね
#< compile-file & load
#なんにしろ、ユニークなオブジェクトをdefconstantとして定義して、それをeqで判定するようなことは、やらない方が良いのかもしれないですね。SBCLの解釈でも定数の再定義の警告はでますし、他の処理系でもeqにならない可能性もあるし、ということで
#あ、上のユニークってのが曖昧ですね、ユニークなオブジェクトを生成するような式で、かつ生成の度に以前とeqでないもの、ですね。(defconstant +foo+ (list nil))とかです。
#CLno
#CLの場合、プログラムの任意の場所が再定義され得るって文化があるからグローバルにそうやるのはあまり馴染まないかもなあ。
#みなさんありがとうございます。コーディング規約的なところでの落とし所はつかめたので納得できました。色々勉強になりました :)
#さきほどのeq問題とは全く別の話題なのですが、今年京都で開催されるILC 2012の参加費用の話で
#事前登録ありで10/21-24通し 一般 4万円、学生 2万円というのはどんなもんだろうという話になっています、
#一日のみは、事前登録ありで、一般 2万 学生 1万です
#自分は、ILCのような国際会議は参加したことがないのでいまいち実感がないのですが、参加希望の方々的にはどんなものでしょう
#それと、comp.lang.lispでもスピーカーのリクエスト等があるかというスレッドがあったと思いますが、全然話題になってないので、リクエストがあれば
#こんなリクエストがあるよと伝言してみたいと思います
#この人が来るなら参加したい!という人とか
#ちなみに参加費用は確定ではありませんので、まだ大まかな目安です
#今のレートだと通しで$500.くらいか。国際会議としては相場じゃないですか。学生はもっと安くできたらいいと思うけど。
#ちなみにsiggraphだと一般(メンバー)$900弱、学生が$400弱ですね。
#なるほど、ありがとうございます。国際会議はそこそこするものなんですね
#そもそもILCってどんなものかが、あまり知られていない気がするので、高いも安いも判断できない、という人も多いかもしれないな、と個人的には思ったりしています
#自分が参加したことがあれば、もうちょっと説明してまわるんですが…
#なんどか行った感じのILCだと外人が多くて場所が外国なだけで、OSC とかLLとかそういうのと似た雰囲気な感じですよ。あとイベントとして長いので接点なくても飯食ったりなんたりのあいだで話したりなんたりな機会がそこそこ。