1 名前:デフォルトの名無しさん [2011/07/06(水) 17:15:15.55 ] lispを触ってみたい入門者のQ&A 初心者のQ&A 本スレでは恥ずかしくて聞けない人のQ&A 本スレは高度すぎて割り込めない人のQ&A linuxでなくてwindowsでやりたいんですが・・・Q&A lispを使用してC#やJAVAの代替にするための方法(おまけ) ま、ゆっくりたりましょう。 「いいものの本質は、いかなる時代においても変わらない」byパワーズ (list (url pc8.2ch.net/test/read.cgi/tech/1101386936/l50 :part 1) (url pc11.2ch.net/test/read.so/tech/1140012484/l50 :part 2) (url pc11.2ch.net/test/read.so/tech/1181479267/l50 :part 3) (url pc11.2ch.net/test/read.cgi/tech/1201402366/l50 :part 4) (url pc11.2ch.net/test/read.cgi/tech/1215834213/l50 :part 5) (url pc12.2ch.net/test/read.cgi/tech/1234884136/l50 :part 6) (url hibari.2ch.net/test/read.cgi/tech/1270370267/l50 :part 7) □テンプレート置き場□ ttp://wiki.fdiary.net/lisp/ (id:guest pass:cl)
892 名前:デフォルトの名無しさん [2012/02/17(金) 01:32:25.22 ] sbclでのコンパイルについて教えて下さい。 以下の方法でSBCL 1.0.40.0.debianでは動いていたはずなのですが、 SBCL 1.0.50.0.debianではエラーが出てしまいます。 メモリが少ないために小分けで何万回と実行する予定ですので コンパイル済みのバイナリとしたいのです。 どうすれば良いでしょうか?よろしくお願い致します。 hell.lisp: (print "HELL!") $ sbcl --noinform --disable-debugger --eval "(compile-file \"hell.lisp\")" --eval '(quit)' ; compiling file "/.../hell.lisp" (written 17 FEB 2012 XX:XX:XX AM): ; compiling (PRINT "HELL!") ; /.../hell.fasl written ; compilation finished in 0:00:00.003 $ chmod +x hell.fasl $ ./hell.fasl unhandled SB-C::INPUT-ERROR-IN-COMPILE-FILE in thread #<SB-THREAD:THREAD "initial thread" RUNNING {AA65919}>: READ failure in COMPILE-FILE: SB-INT:SIMPLE-READER-ERROR at 27 (line 2, column 2) on #<SB-SYS:FD-STREAM for "file /.../hell.fasl" {AA697D9}>: illegal sharp macro character: #\
893 名前:デフォルトの名無しさん [2012/02/17(金) 01:34:17.67 ] (つづき) 0: (SB-DEBUG::MAP-BACKTRACE #<CLOSURE (LAMBDA #) {AA75BAD}> :START 0 :COUNT 128) 1: (BACKTRACE 128 #<SB-SYS:FD-STREAM for "standard error" {AA669C9}>) 2: (SB-DEBUG::DEBUGGER-DISABLED-HOOK #<SB-C::INPUT-ERROR-IN-COMPILE-FILE {AA71861}> #<unavailable argument>) 3: (SB-DEBUG::RUN-HOOK *INVOKE-DEBUGGER-HOOK* #<SB-C::INPUT-ERROR-IN-COMPILE-FILE {AA71861}>) 4: (INVOKE-DEBUGGER #<SB-C::INPUT-ERROR-IN-COMPILE-FILE {AA71861}>) 5: (ERROR SB-C::INPUT-ERROR-IN-COMPILE-FILE :CONDITION #<SB-INT:SIMPLE-READER-ERROR "illegal sharp macro character: ~S" {AA71791}>) 6: (SB-C::READ-FOR-COMPILE-FILE #<SB-SYS:FD-STREAM for "file /.../hell.fasl" {AA697D9}> 25) 7: (SB-INT:LOAD-AS-SOURCE #<SB-SYS:FD-STREAM for "file /.../hell.fasl" {AA697D9}> :VERBOSE NIL :PRINT NIL :CONTEXT "loading")
894 名前:デフォルトの名無しさん [2012/02/17(金) 01:34:51.95 ] (つづき) 8: ((FLET SB-FASL::LOAD-STREAM) #<SB-SYS:FD-STREAM for "file /.../hell.fasl" {AA697D9}> NIL) 9: (LOAD #<SB-SYS:FD-STREAM for "file /.../hell.fasl" {AA697D9}> :VERBOSE NIL :PRINT NIL :IF-DOES-NOT-EXIST T :EXTERNAL-FORMAT :DEFAULT) 10: ((FLET SB-IMPL::LOAD-SCRIPT) #<SB-SYS:FD-STREAM for "file /.../hell.fasl" {AA697D9}>) 11: ((FLET #:WITHOUT-INTERRUPTS-BODY-[PROCESS-SCRIPT]69)) 12: (SB-IMPL::PROCESS-SCRIPT "./hell.fasl") 13: (SB-IMPL::TOPLEVEL-INIT) 14: ((FLET #:WITHOUT-INTERRUPTS-BODY-[RESTART-LISP]30)) 15: ((LABELS SB-IMPL::RESTART-LISP)) unhandled condition in --disable-debugger mode, quitting $
895 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 05:07:44.25 ] lispboxをXPで使いたいんだがbat実行しても動かん; 落としてきてbat実行するだけじゃダメなのかこれ? linuxのはsh実行するだけで普通に動いたんだが
896 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 05:39:03.41 ] 追記:後、時々、win版は自動インストーラがついてるって書いてるブログあるけど、 これは昔のバージョンだけ?lispbox-0.7には入ってないみたいだけど
897 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 06:20:45.30 ] batファイルをどう実行したの? ダブルクリックではなくコマンドプロンプトから実行すれば 何かしらエラーメッセージでも出そうなものだけど
898 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 06:46:01.31 ] >>892 むしろ、その話が事実だと、前はFASLをそのまま実行できたということに。マジですか。 SBCLでバイナリを作るには、cl:compile-fileじゃなくてsbcl-ext:save-lisp-and-dieを使えば大丈夫。 Common Lispでは(Cとかでもそうだけど)コンパイルと実行形式を作ることとは別なのでご注意。 cl.cddddr.org/index.cgi?%bd%e8%cd%fd%b7%cf%3a%bc%c2%b9%d4%a5%d5%a5%a1%a5%a4%a5%eb%a4%ce%ba%ee%a4%ea%ca%fd ただ、メモリの消費量とバイナリにすることって、多分あんまり関係ないと思うけど、 それはそれで大丈夫なんだろうか。
899 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 08:02:38.86 ] >>897 すいません、自己解決しました; windowsのユーザーフォルダ名が日本語だったのでそれが原因でエラーが 起きてた模様 レスありがとうございました
900 名前:デフォルトの名無しさん [2012/02/17(金) 13:12:34.76 ] >>898 ありがとうございます。 >むしろ、その話が事実だと、前はFASLをそのまま実行できたということに。マジですか。 faslにはシバン(#!/usr/bin/sbcl --script)が付加されてるので実質はsbcl呼んでるんですけどね。 0.50にも付いてるのですが動かなくなりました。 >SBCLでバイナリを作るには、cl:compile-fileじゃなくてsbcl-ext:save-lisp-and-dieを使えば大丈夫。 save-lisp-and-die時のTOPLEVELの指定が分かりません。 スクリプトとコンパイルのソースを共有したかったので。 実行時型チェックすれば良いのだろうけど。 >ただ、メモリの消費量とバイナリにすることって、多分あんまり関係ないと思うけど、 起動に掛かる時間を減らしたいのです。 コンパイルとか数秒掛かるでしょ。何万回とかになると何時間にもなるのではないかと。 実際は何百万回とかだた。
901 名前:デフォルトの名無しさん [2012/02/17(金) 13:27:19.85 ] 補足です。 # save-lisp-and-die時のTOPLEVELの指定が分かりません。 WEBだと関数を指定しているものばかりなのですが、 スクリプトの場合は関数の呼び出しまで記述する必要があり 共用させるのに「おまじない」が必要になります。 例示した様なスクリプト形式のままで実行出来る コンパイルの方法が分からないとの意味です。
902 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 14:18:49.78 ] >>900 なるほど。そちらの事情は把握できたと思う。 とりあえず、1.0.51以降でのFASL周りの変更は、型関係の不具合修正だけなはずなので、 1.0.55でも直ってない気はする。1.0.40以降のリリースノートにも書いてないように見える。 それって正式な機能なのかな? マニュアルのFASLの項には特に書いてない感じだけど。 正式な機能ならLaunchpadへ報告どうぞ。そうでなくとも、MLで聞いてみても良いかも。 自分なら、トップレベルの関数を利用する形にスクリプトのコードを自動変換し、 それをコンパイルしてロード、save-lisp-and-dieするまでの処理を自分で書いちゃって、 今度からそれを使うようにすると思う。一度書いちゃえば次からは使い回しもできるし。 ただ、いかにもkludgyではあるので、そちらのお気には召さないかも。 それと、多分バイナリにまでする必要はなくて、ロードした状態のイメージを保存して、 それを処理系を起動するときのイメージとして指定すれば、同じ効果が得られると思う。 ロード時間を削るために良く使われる手じゃないかと。
903 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 18:03:16.60 ] >>900 いまいち何がしたいのか理解できてないけど、バイナリにしたいのではなくて、コンパイル済のファイルを呼び出したいだけではないの? シバンに任せずに普通にloadしてはいけないの?
904 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 18:07:10.83 ] >>900 エラーの直接の原因としてはfaslファイルの2行目の# FASLの部分でマクロキャラクタと判別してるからだと思う。
905 名前:デフォルトの名無しさん [2012/02/17(金) 20:30:39.44 ] 沢山のコメントありがとうございます。 >>902 LISP初心者なんでLaunchpadとかよく分かりません。 ベテランLISPerが誰も困ってないのなら仕様どおりなのでしょう。 処理時間の関係だけなので実はソースを弄ってsave-lisp-and-dieで既に動かしてはいます。 今まで便利だったのでそのまま使えたらと考えました。 >ただ、いかにもkludgyではあるので、そちらのお気には召さないかも。 ソースコードの可読性が損なわれないなら問題ありません。 >トップレベルの関数を利用する形にスクリプトのコードを自動変換し、 LISPならこんな事も簡単?に出来るのでしょうか。勉強してみます。 >ロードした状態のイメージを保存して、それを処理系を起動するときのイメージとして指定すれば、 これってsave-lisp-and-dieの事ですよね。 >>903 個人的にsave-lisp-and-dieの方法も検討していたので書き方が混乱していました。 目的は処理時間の短縮なので方法には拘りません。今まで(とは言っても数日ですが) 動いていたのが環境を変えたら動かなくなったのでどうなったのかなと。 >>904 なるほど。 実は0.40ではシバン付けたままでもコンパイルが通ってたんですよ。 シャープマクロ?の解析方法が変わったのかもしれませんね。
906 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 00:55:04.52 ] >>905 Launchpadってのは、オープンソースプロジェクトのホスティングサービスで、 その機能のひとつであるバグトラッキングシステムをSBCLは使ってる。 非公式な機能でなければ、開発者に不具合報告してみれば良いのでは、って話。 イメージの件はそう。:executable tを指定しなければ単なるコアイメージができる。 あと、コードの変換については、別にそんな難しいことを言ってるわけじゃなくって、 こういうのをcompile-fileの代わりに使えば良いんじゃないかと思う。 (defun script->executable (exe-file-name src-file-name) (let ((tmp-file-name (format nil "~a.tmp" src-file-name)) (toplevel-symbol (gentemp "TOPLEVEL"))) (with-open-file (src src-file-name) (with-open-file (tmp tmp-file-name :direction :output :if-exists :error) (format tmp "(defun ~a ()~%" toplevel-symbol) (do ((line (read-line src nil) (read-line src nil))) ((null line)) (write-line line tmp)) (format tmp "~&)~%"))) (compile-file tmp-file-name) (load tmp-file-name) (delete-file tmp-file-name) (sb-ext:save-lisp-and-die exe-file-name :toplevel toplevel-symbol :executable t)))
907 名前:デフォルトの名無しさん [2012/02/18(土) 18:08:27.54 ] >>906 コードまでありがとうございます。全体をdefunで括っても構わないのですね。 何となくdefunやrequireなんかを除外しないといけない様な気がしていました。 早速シバンの除去とコマンドラインから起動出来る様にしました。 これで今まで同様の操作で行けます。本当にありがとうございました。
908 名前:デフォルトの名無しさん [2012/02/18(土) 18:09:12.81 ] あと、皆様ごめんなさい。 SBCL自体では *シバンはサポートしてない* みたいです。 私の環境で動いたのは~/.sbclrcに以下を記述していた為でした。 (同様な記述がいくつもありますがおそらくwww.kono.cis.iwate-u.ac.jp/~hiki/?SBCL からのコピペ) 0.40でも0.50でも全く同じに設定(FTPでコピーしたのでcksum値も同じ)してあるのですが、 動作が変わった理由が分かる方おられますか? なお、上記代替策がありますのでそれ程逼迫したものではありません。 お騒がせして申し訳ありませんでした。 ;;; If the first user-processable command-line argument is a filename, ;;; disable the debugger, load the file handling shebang-line and quit. (let ((script (and (second *posix-argv*) (probe-file (second *posix-argv*))))) (when script ;; Handle shebang-line (set-dispatch-macro-character #\# #\! (lambda (stream char arg) (declare (ignore char arg)) (read-line stream))) ;; Disable debugger (setf *invoke-debugger-hook* (lambda (condition hook) (declare (ignore hook)) ;; Uncomment to get backtraces on errors ;; (sb-debug:backtrace 20) (format *error-output* "Error: ~A~%" condition) (quit))) (load script) (quit)))
909 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 03:31:07.45 ] stumpwmはそろそろ実用してもいいのだろうか
910 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 19:41:19.23 ] emacsのslimeを使っていて疑問に思ったのですが、 slimeやACLのIDEができる前のcommon lispの開発は どういう環境で行っていたのでしょう? まさかとは思いますが括弧の対応を一つ一つ目で確認していたのですか
911 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 19:47:39.55 ] Emacsが処理系の中に実装されていたのです。MacLisp, Symbolics 二昔前のLispは統合開発環境しかなかったんです。(ちょっと嘘w) というか統合開発環境とはLispのことでした。(Basicとかもあったけどw)
912 名前:SCHEME餃子 ◆8X2XSCHEME mailto:sage [2012/02/20(月) 20:00:20.08 ] 今だと OS, 言語処理系, 開発環境 という概念が分かれているけど、 昔はそれほどきちんとした線引きが無かった。 今でも厳密に定義付けされているわけではない。 俺は世代的にそれほど古い時代を知ってるわけじゃないが、 N88-Basic (DISK版) が OS であり 言語処理系であり エディタ であり デバッガでありアセンブラであったことは知ってる。 (使ってた) それと似たような感じなのかなぁ?
913 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 23:02:35.23 ] Emacs としては標準で LISP モードがあったし、 さらに、各処理系ごとに独自の emacs モードを添付していたりしてた。 統合環境としては SLIME の前 (90年代) には ILISP というものががあった。 自分の経験(ここ20年)でいえば、手で括弧対応ってのは一度もなかったね。
914 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 23:37:47.09 ] うろ覚えなんだけど、昔、超括弧ってあったよね? ] を入力すると括弧全部閉じたことになるやつ。 エディタが賢くなって無意味になったけど。
915 名前:デフォルトの名無しさん mailto:sage [2012/02/21(火) 00:40:57.06 ] [もあったよ。 ]で最初の[まで全部閉じる。 要するに[(([((]]は、(((((())))))と同じ。
916 名前:デフォルトの名無しさん mailto:sage [2012/02/21(火) 01:10:50.04 ] みんな若いんだなぁ PC-8001でカセットテープからLispインタープリタ読み込んで 左かっこで指折って右かっこで指伸ばして数えてたこと思いだした
917 名前:デフォルトの名無しさん mailto:sage [2012/02/21(火) 11:36:03.91 ] [(((;゚Д゚]
918 名前:デフォルトの名無しさん mailto:sage [2012/02/21(火) 11:42:33.18 ] 911です。皆さんありがとうございます。 知らない話ばかり聞けてうれしいです。 たしかgaucheのshiroさんだったと思うのですが common lispはそれ一つで完結する開発環境を持っているとおっしゃっていた気がしますが 伝統的なものなのですね。勉強になりました。
919 名前:デフォルトの名無しさん mailto:sage [2012/02/21(火) 21:12:52.60 ] >>914-915 それは凶悪シンタックスだな。
920 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 09:53:27.22 ] lisp始めたてだけどまだまだ括弧の多さになれない。
921 名前:866 mailto:sage [2012/02/22(水) 16:21:37.34 ] 字句解析について質問していたものです。その節はありがとうございました。 今度はcl-yaccについてお聞きしたいのですが、 paste.lisp.org/display/127909 ソース冒頭に書いた3点に対応するにはどう書き換えればよいでしょうか。
922 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 21:20:24.55 ] Common Lisp はそれ単体で完結した開発環境ではない。 その証拠にエディタを起動する手続き ed が存在する。
923 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 21:54:17.92 ] edは内部で実装されてる関数でもいいんだけども。 (ed '関数名) (ed "ファイル名") こんな関数でもいいし。 CMU Common Lispでは内部にEmacs-likeなeditor, HEMLOCKが実装されていて、 ed関数を実行するとHEMLOCKが呼び出された。 最近使ってないから今もそうかは知らない。
924 名前:デフォルトの名無しさん mailto:sage [2012/02/23(木) 07:41:50.10 ] sites.google.com/site/shidoinfo/Home/programing-lang/%E9%96%A2%E6%95%B0%E5%9E% 8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E /lisp/common-lisp/%E5%88%9D%E5%BF%83%E8%80%85%E3%81%AE%E7%82%B A%E3%81%AElisp%E7%92%B0%E5%A2%83 ここのlispboxの使い方の項なんですが、 smartcalcconsoleini.lispをc-c c-kでコンパイルしようとしても 1 compiler notes: smartcalcconsoleini.lisp:14:1: warning: Undeclared free variable *WARN-ON-FLOATING-POINT-CONTAGION* Compilation failed. となってしまうんですが、どうしたらいいのでしょうか?
925 名前:924 mailto:sage [2012/02/23(木) 09:37:42.03 ] 失礼、自己解決しました; 普通に (load "smartcalcconsoleini.lisp") で動きました; 手順にコンパイルするよう書いてあったのでそうしたのですが、、、 動いてよかったけどなんで動いたのか・・・;
926 名前:デフォルトの名無しさん mailto:sage [2012/02/24(金) 02:42:41.49 ] PAIP邦訳の5章の演習問題の回答に5.19とあるのですが5.18の表記ミスですか?