2 :
デフォルトの名無しさん :2006/02/15(水) 23:12:14
2 get
/ / 3 / /
ヌ ル ポ
((お勧めの Common Lisp 処理系)
(SBCL:
http://sbcl.sourceforge.net/ :プラットフォーム UNIX, Linux, Mac, Windows(移植中)
:開発 活発
:日本語 使える(UCS4, UTF8, EUC)
:特徴 一番お勧めのコンパイラ。)
(CLISP:
http://clisp.cons.org/ :プラットフォーム UNIX, Linux, Mac, Windows
:開発 そこそこ活発
:日本語 使える
:特徴 バーチャルマシン。遅いがフットプリントが小さい。)
(CMUCL:
http://www.cons.org/cmucl/ :プラットフォーム UNIX, Linux, Mac
:開発 そこそこ活発
:日本語 使えない(回避法有り)
:特徴 高速コンパイラ。SBCL の元になった。)
(OpenMCL:
http://openmcl.clozure.com/index.html :プラットフォーム PPC-Linux, Mac, x86-Linux と FreeBSD に移植中
:開発 そこそこ活発
:日本語 使えない
:特徴 元々商用のコンパイラ。ネイティブスレッドが使える。))
スレも改まったことだし、参考書にはPractical Common Lispも。
PCL、すげーいいよ。
あるディレクトリの拡張子が指定されたものであった場合に、条件に 合致する全てのファイルを削除するlisp式ってどう書きます? 前スレでも教えてもらったのだがABCLではどう書きます?
>>13 (mapc #'delete-file (directory "/path/*.ext"))
>>14 ありがとうございます
ここの人は優しいなァ
質問です。floatのarrayに対してアクセスする度に(?)メモリを使っ ていく様子なのですが、そういうもんなんでしょうか? たとえば、arrayの中の与えられた要素の和を返す関数: (defun foo1 (array positions) (let ((sum 0.0)) (map nil #'(lambda (x) (setq sum (+ sum (aref array x)))) positions) sum)) (compile 'foo1) に対して float のarrayを以下のように作成します。 (setq sa1 (make-array 10 :element-type 'float :initial-contents (loop for i from 1.0 to 10.0 by 1.0 collect i))) すると、 (time (foo1 sa1 #(1 2 3 5 7))) …… ; space allocation: ; 3 cons cells, 80 other bytes, 0 static bytes といった具合に「80 other bytes」が使われます。 これは定数ではなくアクセスする数が増えるに応じて16bytesずつ使われます。 一方で、integerの場合 (time (foo2 sa2 #(1 2 3 5 7))) …… ; 3 cons cells, 0 other bytes, 0 static bytes となり 0 otehr bytes です。 大きなfloatのarrayを使いたいので何とかならないかなと思っているのですが… 処理系はAllegroを使っています。 どなたか情報お持ちの方教えてください。
>>17 ガベジコレクタ様がよきに計らって下さるので、下々の者は気にしない、気にしない。
19 :
17 :2006/02/17(金) 01:30:53
たしかにメモリが足りなくなることはないのですが、
プログラムがやたら遅くなるので、やっぱなんとかならないかなと
思ってます。
ついでですが、
>>17 のfoo1は loop 〜 across 〜 summing を使った方
が見やすかったかもですね。
(個人的には loop は意味不明なのでなるたけ避けてる)
array, sum あたりを declare するとマシになったりしない?
21 :
17 :2006/02/17(金) 03:07:06
>>20 (declare (type (array float (*)) array)) および (the (aref array x))
を入れてやってみましたが変わらずでした。
まさか、fixnum を越えるような値の場合は必ず一旦変換するのかなあ…
>>21 失礼 (the float (aref array x)) です。
>>17 integer でも fixnum を超える(most-positive-fixnum 以上になる)と
メモリ消費量が増えていくんじゃない? ACL は使った事無いけど...
24 :
23 :2006/02/17(金) 03:14:28
あ、出遅れた。ちなみに SBCL では fixnum 超えると integer でもメモリ使用量増えました。 optimize space とかも試してみたけど、ダメだった。
25 :
17 :2006/02/17(金) 03:44:41
配列参照のほうじゃなく、sumに突っ込むときヒープにアロケートされてるとか。
27 :
23 :2006/02/17(金) 04:01:02
(+ sum (aref array x)) の終了時に一時的に値を保存してるのかもね。 SBCL の Compiler Note だと "<return value>" つーのが正体かな? ; (+ SUM (AREF ARRAY X)) ; ; note: doing float to pointer coercion (cost 13) to "<return value>", for: ; the first result of inline float arithmetic
28 :
23 :2006/02/17(金) 04:02:30
う、毎回レスが被ってスマソ。
lambda 式が map に値を返してるからじゃないの? #'(lambda (x) (setq sum ...) (values)) だとどうよ。
LispWorks だけど (declare (optimize (speed 3) (space 0) (debug 0) (float 0))) (declare (type (simple-array double-float (*)) array) (type (simple-array fixnum (*)) positions) ...) と do, svref に the double-float, the fixnum とか使って positions の要素数に かかわらず Allocation = 16 bytes standard / 0 bytes conses まで最適化できた. Allegro はしらんけど float って型じゃ意味なくね? double-float とか single-float とか指定すべきでは.
17じゃないけどACL8.0で
>>30 と同じようなことして16 other bytesまで
持って行った。けど間違った結果が返って来る罠(w
(declareに:explain仕掛けて真剣にコンパイラと向き合わないとダメだろね。きっと。
クロージャを使うと、変数を変更するにはメモリを経由しなくちゃいけない。 この場合非破壊的変更だから、sum を変更する際はヒープに float 領域を 割り当て、そのポインタを sum が指すようコンパイルされる。 一方、マクロを使って (defun foo1 (array positions) (declare (type (simple-array single-float (*)) array)) (let ((sum 0.0)) (declare (type single-float sum)) (dotimes (i (length positions) sum) (setq sum (+ sum (aref array (aref positions i))))))) のようにすれば、(コンパイラにもよるけど) sum をレジスタに割り当てる ことができるので、変更する度にヒープを使うことはなくなる。 詳しくは disassemble してみよう。
33 :
17 :2006/02/17(金) 11:34:16
みなさんありがとうございます。
主に
>>30 ,
>>31 を参考にして、
(defun foo3 (array positions)
(declare (optimize (speed 3) (space 0) (debug 0))
(type (simple-array single-float (*)) array))
(let ((sum 0.0)
(psize (1- (the fixnum (array-total-size positions)))))
(do ((i 0 (incf i)))
((> i psize))
(setq sum (+ (the single-float sum) (the single-float (aref array (the fixnum (aref positions i)))))))
sum))
を「AllegroCL8.0で」動かすと見事定数にできました。
#
>>31 にあるような間違った結果はまだ確認できてないです
実はこれまでACL7.0を使ってたのですが、同じ関数でもACL7.0
ではうまくいきませんでした。
なんだかいろいろと勉強になりました。
特になんでもコンパイラ任せにしてたのを反省できたのが収穫でした。
34 :
17 :2006/02/17(金) 11:38:16
>>32 ありがとうございます。これまた勉強になりました。
# 俺
>>33 を30分かけて書いてたのか…
35 :
17 :2006/02/17(金) 12:26:17
何度もすいません。
改めて
>>32 をAllegroCL7.0で
(declare (optimize (speed 3) (space 0) (debug 0)))
で動かすと、これは(ACL8でなくとも)見事定数でした。
>>33 で「ACL7だめじゃん」って思った俺がだめだめでした。
36 :
30 :2006/02/17(金) 22:30:44
>>31 すまん。 simple-vector と svref な。(simple-array と svref で debug 0, safety 0 じゃバグるって)
SBCL 0.9.9.31 と LispWorks 4.4.6 ともにコンス無しにできたよ。
「ACL7だめじゃん」ってスゴイな。DuaneとかJohnが聞いたらどんな反応するだろか。 人づてに聞いた話では古参Lisper達は「コンパイルしたらコードがどう生成されるか」を 常に意識してS式を叩いていたそうな。 近頃の若いモンはなっとらんと叱られたけどそんな細かいところまでチューニングする 必要に駆られることあまり無いからね。やるにしてもプロファイラ使ってちゃんと 追い込んでいかないと要らんトコ最適化してたりするし。
>>「コンパイルしたらコードがどう生成されるか」 Cプログラマでもやるよ。 おれはヘタレなスクリプト言語しか使えないけど…
C→機械語とSEXP→機械語では後者の方が脳内変換コストがでかいと思う。
>>39 でもLispならパターン決まっちゃえばあとはマクロで楽々だからな。
C++ のテンプレートとかも気分的には近いものはあるが。
どうみても disassemble を使う方が脳内変換より確実です。本当にありがとうございます。
42 :
10 :2006/02/18(土) 23:58:36
)) ; 括弧閉じ忘れてた...
44 :
デフォルトの名無しさん :2006/02/23(木) 01:17:12
ABCLでlispインタプリタにjavaのデータを渡す方法ってありますか? lipsデータを取る方法は解ったんですが、渡す方法が解らないです。
ひょっとしてabclではdefclassは出来てもdef-java-classみたいなことは 出来なかったりするのか?
46 :
44 :2006/02/23(木) 14:43:48
47 :
デフォルトの名無しさん :2006/02/24(金) 00:17:49
fu
>5つの基本関数だけをもつ純LISPが挙げられる。 これの仕様ってわかりますか?
必須なのは lambda だけ
51 :
50 :2006/02/26(日) 03:20:45
quote と atom って必須なのかな?
>quote と atom って必須なのかな?
quoteのかわりにeqが要るらしい
http://ja.wikipedia.org/wiki/%E7%B4%94LISP 五つの基本関数とは、
1. car リストの左値をとり出す。(car[(A . B)] -> A)
2. cdr リストの右値をとり出す。(cdr[(A . B)] -> B)
3. cons 二つの値からなるリストを作る。(cons[A;B] -> (A . B))
4. atom 値がアトムならTを返す。(atom[(A B)] -> nil, atom[nil] -> T)
5. eq 二つの値が同じ物ならTを返す (eq[A;A] -> T)
以上が最小構成のLISPであり、理論上チューリングマシンと同等の能力を持つ。
>>53 論文斜め読みした。5関数といくつかの天下りシンボル(NIL, T, LAMBDA, QUOTE)で
万能関数(要するにeval)がちゃんと定義できるよという感じか。
SICPみたいに car, cdr, cons をlambdaで代用しても駄目? lambdaは関数じゃないけど。
マッカーシーのLispはダイナミックスコープだから
質問させてください。 Emacsを使っていたのでいっちょlispを本格的に覚えようかと思い、 Debian(sarge)にapt-get install gclでGNU Common Lispを入れてみました。 が、gclで起動後、どうやったらtest.lspに書いたlispコードを実行してくれるのでしょうかが分からず困っています。 test.lspの中身は(+ 1 2)です。 ちなみにclispも入れてみたのですがclisp test.lspとすると、 WARNING: *FOREIGN-ENCODING*: reset to ASCIIというエラーが出るのですが、 こちらもお分かりになる方がいましたら合わせて教えていただけたらと思います。 お願いします。
失礼しました。 >実行してくれるのでしょうかが分からず困っています。(誤) 実行してくれるのかが分からず困っています。(正)
gcl ねぇ?使ったことないけど gcl -load test.lisp もしくは起動後に > (load "test.lisp") かね.clisp のエラーは,たぶん使ってる環境の文字コード設定が clisp に理解できてない.iconv がリンクされてないか,環境の設定が おかしいか.とりあえず clisp -Eforeign 1:1 とでもすればいくない? clisp -Eforeign ascii test.lisp でもいいかも
60 :
57 :2006/03/02(木) 22:42:31
>59さん レスありがとうございます。 >(load "bin/test.lsp") Loading bin/test.lsp Finished loading bin/test.lsp T となりました。 どうやらこれで読み込みは出来たという事みたいですが、 実行結果を出力するにはこれだけでは足りないのでしょうか。 clispは相変わらず以前と同じエラーが出ています。 エンコード設定はEUC-JPです。 システム自体のエンコードも、ファイルのエンコードも同じです。 ひょっとしてclispはEUC-JPは使えないのでしょうか。 何かおかしいと思って、test.lspの中身を (+ 1 2 3)から(print (+ 1 2 3)としたら clispでもgclでも以下の様に実行する事が出来ました。 [1]> (load "bin/test.lsp") ;; Loading file test.lsp ... 6 ;; Loaded file test.lsp T しかし相変わらずclisp test.lspで一気に実行結果出力は出来ませんでしたが、 実行する事は出来ました。 ありがとうございます。 何やらshやphp等とは全く違う感じですね。 こんな初心者ですがこれからもよろしくです。
61 :
デフォルトの名無しさん :2006/03/02(木) 23:45:24
つうか sh でも php でも計算結果を表示しようと思ったら echo なり print なりするでしょ?表示っつー機能が必要. CLISP は適切な libiconv がリンクされていれば EUC-JP は使える.が,どう も貴方のお使いの CLISP は他言語サポートが入ってないんじゃないかという気 がしてきた. (format t "~{~A~&~}" (list (lisp-implementation-version) *features*)) こんな一行のファイルを foo.lisp とでも保存して,clisp foo.lisp で結果を 張り付けてくれ.あと,できればプロンプトで (load "bin/test.lsp") と操作 できるなら,euc サポートが含まれているか確認してみて. [1]> charset:euc-jp #<encoding "EUC-JP" :unix> [2]> 上記は私の環境での結果です.EUC も UTF-8 も SHIFT-JIS も使えてるよ.
62 :
57 :2006/03/03(金) 00:23:16
[1]> (load "foo.lisp") ;; Loading file foo.lisp ...2.33.2 (2004-06-02) (built 3318073317) (memory 3350292839) (ASDF SYSCALLS CLX-ANSI-COMMON-LISP CLX REGEXP CLOS LOOP COMPILER CLISP ANSI-CL COMMON-LISP LISP=CL INTERPRETER SOCKETS GENERIC-STREAMS LOGICAL-PATHNAMES SCREEN FFI GETTEXT UNICODE BASE-CHAR=CHARACTER PC386 UNIX) ;; Loaded file foo.lisp T [2]> charset:euc-jp #<ENCODING "EUC-JP" :UNIX> です。 どうでしょう。 >つうか sh でも php でも計算結果を表示しようと思ったら なるほど。確かにそうですね...
2.33 かぁ.結構古いなぁ….でも unicode サポートも euc-jp エンコーディングも 入ってるね.ASDF が入ってるところをみると,誰かが設定済みなのかな. WARNING: *FOREIGN-ENCODING*: reset to ASCII これはエラーじゃなくて警告ね.FFI とか C とのやりとで使うエンコーディン グが ASCII コンパチじゃないといっている. clisp -Eforeign iso-8859-1 のような ASCII コンパチの encoding を指定すれば消えるんじゃないかな.もっ と新しいバージョンだと clisp -Eforeign 1:1 とかいけるんだけど.
64 :
57 :2006/03/03(金) 02:09:57
細かいところまでありがとうございます。 中々難しいかもしれないけどがんばってみます。 clisp立ち上げずに下記をたたいてみたら、 clisp -Eforeign euc-jp lisp/test.lsp WARNING: *FOREIGN-ENCODING*: reset to ASCII 6 と、相変わらずワーニングは出るけど結果は出力されました。 clisp lisp/test.lsp WARNING: *FOREIGN-ENCODING*: reset to ASCII 6 とやっても同じのようですね。 >ASCII コンパチの encoding を指定すれば消えるんじゃないかな この辺キーワードにして調べてみます。 ありがとうです。
あー誤解があるようですね.*FOREIGN-ENCODING* は「C の共有ライブラリを直 接呼び出す機能 (Foreign-Function Interface)」で使うエンコーディングを指 定しますが,通常ここはバイト列として扱いたい ( C のライブラリでは画像 データなど文字以外も扱えるので)なんで日本語のエンコーディング指定しちゃ ダメです.バイト列として扱うために,あえて clisp -Eforeign iso-8859-1 のように指定します.端末やファイルのエンコーディングの指定とは別の指定 なので,このように指定したかといって日本語が使えなくなるとかそーゆう事 はありません.むしろ,ここで euc-jp を指定しているから WARNING が出てい るんです.上記のように iso-8859-1 を指定すれば治ると思いますよ.
バイト列を扱いたいなら unsigned-byte を使えばいい。
国際化されたライブラリを呼び出す場合、EUC-JP に setlocale されてる環境
で文字を ISO-8859-1 にエンコードして渡すとかえっておかしくなるよ。
>>57 の環境で warning が出るのは 2.33 以前では FFI にマルチバイトエンコー
ディングを使えなかったから。
NEWS:
2.34 (2005-07-20)
* The FFI variable FFI:*FOREIGN-ENCODING* can now be a multibyte encoding.
The warning "*FOREIGN-ENCODING*: reset to ASCII" at startup is gone.
67 :
57 :2006/03/03(金) 13:10:21
!誤解していたようですね... なるほど。 という事でやってみました。 $ clisp -Eforeign iso-8859-1 lisp/test.lsp 6 出来ました。 ありがとうございます。 ついでに以下もやってみました。 $ clisp -Eforeign unicode lisp/test.lsp WARNING: *FOREIGN-ENCODING*: no encoding UNICODE, using ASCII 6 $ clisp -Eforeign ascii lisp/test.lsp 6 将来的にはCLOS(でしたっけ?)を使えばサーバアプリを(多分)書けるとの事なので、 やってみたいですね。 ひょっとしてclisp 2.33より上ならば何も問題無いのかな。 だとしたら本家からDLして持ってきたら良いのかな? とちその辺も含めて色々とやってみます。 どうもありがとう。
69 :
デフォルトの名無しさん :2006/03/18(土) 23:18:02
キタこれ CLISP最強伝説の幕開けか?
ネイティブコードに拘らない(中間言語インタプリタでよい)のならCLISPはなかなか バランスの良い処理系だと思う。インタプリタの速度なら結構良い勝負するし。
>>69 もちつけ。CLISP じゃ伝説はむりだろ。まぁ起動時にエンコーディングまわり
の警告がでないという点は初心者向けには良いのではないだろうか。
すまん、LISP初心者つーか何もよくわかってないんだが、Cとかと同違うと? 下のようなコードはLISPだと根本的に書き方がちがくなるのか? { FileOpenDialog fdlg=new FileOpenDialog(); RESULT res=fdlg.DoOpen(); if(res==OK){ Files files=fdlg.SelectedFiles; FileSystem.CopyFiles(files); } } 神様よろ。
インデントがうまくいかねぇ { FileOpenDialog fdlg=new FileOpenDialog(); RESULT res=fdlg.DoOpen(); if(res==OK){ Files files=fdlg.SelectedFiles; FileSystem.CopyFiles(files); } }
「根本的」の定義次第だが、おそらく君の考えている意味では違わないだろう。
>>72 括弧の位置が変わるくらいじゃないかな?
慣れればその違いも気にならなくなると思うよ。
基本的には
object.method(arg);
ってのが
(method object arg)
になるって感じ。
マクロにして (with-file-open-dialog (files) (file-system-copy-files files)) とか
lispの使えるレンタルサーバーって、ありますか???
>>77 サクラインターネットとか?
使えるつーか、コンパイル環境あるからgaucheとか入れれるよ
79 :
77 :2006/04/13(木) 08:12:36
ほす
既出でしたらすみません。 最近,SchemeでSchemeのコンパイラを作ってみたいなと思っています。具体的にはSchemeのコードをネイティブなマシンコードへコンパイルしてみたいと考えています。そのためにはどのような本を読めばいいのでしょうか?
>>81 君の知識、得意分野、アイデアをもうちょっと晒してもらわんとなんともはや。
少なくとも「サルでも作れるSchemeコンパイラ」のような本は無いと思う。w
>>82 すみませんでした。
処理系はGaucheを使っていて日常の雑務を行うプログラムを組んだりライブラリを使ったりできます。また継続やマクロを使ってプログラムを組めます。BNFで書かれた仕様も読んだり書いたりできます。
わからないのは,どうやって読み込んだS式を効率良い形に変換し,マシンコードへ変換するかというところと,アセンブラです。アセンブラはCASLでやっただけです。
Scheme は言語仕様が小さいから、、、ってよく聞くけど、GC もあるし継続もあるし、 コンパイラ作りたい初心者に向いてる言語じゃない様な気がする。
GCはともかく継続はなあ。
>>84 ありがとうございます!
さっそく読んでみます。
と思ったが、一応 web.archive.org から一式拾っておいた。
91 :
デフォルトの名無しさん :2006/04/23(日) 02:47:47
incrementalなgcでソースの読みやすいものってある?
Matz? というのは冗談としても、わざわざインクリメンタル GC を実装している 処理系自体少なそうだね。
IoだったかLuaだったかがやってたような気がする。 tricolor schemeをそのままコードにしたようなものでわかりやすい と思った。いわゆるlightweight系な言語だったのは覚えてるんだが どの言語だったかはっきり覚えてない。すまん。
甘えてすまそ SBCL-0.9.12にWINDOWSのバイナリーがあったので 落としてきたのだけど、インストールマニュアルを見ても 起動しない・・・ sbcl-0.9.12-x86-win32\src\runtime にパスを通して SBCL --core sbcl.core で起動しても当然coreが見つからんし 英語読解力不足を棚に上げて悪いけど助けて!
SBCL on Win32はまだ、SBCLそのものをいじりたい人しかおすすめできないなあ。
>>95 96
ありがとう動いたよ!
SBCL ON Win32がまだまだなのはわかってるんだけど
あの爆速を体験すると触りたくなるのよね。
WinでLisp & Schemeとなると選択肢減るし、
普段が Petite Chez だからスピードに憧れるのよね。
OpenMCL は Solaris にも porting されるみたいね。 SBCL のスレッド回りも急激に進展してるようで、非常に wktk.
すみません。 lispってCommon LispとかSchemeとかいろいろあるみたいですが、 何が違うのでしょうか?
名前
JavaとC#くらい違ってるし、JavaとC#くらい似ている。
[Common Lisp の歴史] Lisp (1950年代) 誕生 -> MacLisp, InterLisp とかイロイロ乱立 -> ベンダーが集って Common Lisp で規格化 (1984) 商用ベンダが集まっただけあってコンパイラを意識した規格になっている。ロー ド,リード,コンパイル,評価時などを意識しているし,型システムについて も決まってる。パッケージやオブジェクトシステム,デバッガやプロファイラ なども規格に入ってる。 で,それとは別の流れとして 1970 年代に高名な Lisper が提唱して大学とか 情報科学の分野で進化してきたのが Scheme。こっちはミニマリスト的な考えに 基づいている。そんかわりコンパイラやパッケージ,型の取り扱い,オブジェ クトシステムなどが規格に入ってない。末尾再帰の最適化や継続など Common Lisp には無い機能が入ってたりする。
104 :
デフォルトの名無しさん :2006/05/09(火) 09:48:27
Linux かWin 上の Clisp でグラフィックとかGUIやりたいんですけど 何をどうすればいいのでしょうか。 GNUPLOTに書かせるのはとあるサイトにあったので それはやってみました。
まず以下の作業をやってみたら? Swingでguiプログラムを書く。 次にそのプログラムを書くlispプログラムを書く。 マクロ使いまくってコードの長さを半分以下にする。
どうもです。 LTKを使うのがわりとやりたかったことっぽいようです。 ありがとうございました。
ほす ラムダっちゃ
空ageしとこう ラ無駄無駄無駄無駄無駄無駄無駄無駄ァーーー!
自分で定義した関数の関数定義を調べる関数は有りませんか? 例えば、fac という関数を定義されていたとして、 (show-definition #'fac) とすると、 引数 n と、 定義 (if (= n 1) 1 (* n (fac (1- n))) 等が 帰ってくる、show-definition みたいなものを探しています。
find の関数は列から一致した要素を返しますが、 元の列から一致した要素以降の列を返す関数はないですか?
>>111 function-lambda-expression
>>114 ありがとです。
関数の定義を受け取って、
ある種の構文解析をするツールを作ってたのですが、
(parse-function '(defun fac (n) ...))
ってするのはあまりに面倒なので、
(parse-function #'fac)
と、したかったのでした。
>>113 ありがとです。
周囲に LISP を使う人がいないので簡単な事もなかなか分かりません。
>>115 で出力する際に構文要素がだぶって出力されるのを抑えるために Unix の uniq -d コマンドと同等の関数が欲しかったのですが、
copy-tree のアルゴリズムを応用して作成しました。その際に
(member item list :test (complement pred))
みたいな関数があるとすぐに書けるな〜。って思った訳です。
ちなみに、 uniq -d みたいな関数もしくはそれを実現出来る関数はありますか?
117 :
デフォルトの名無しさん :2006/07/01(土) 01:13:26
ずっと前に誰かが言って気になっていたことなのですが、 「Lispと言えば今でも現場で画像処理なんかに使われている。」 って言葉がひっかかっています。 Lisp = 型宣言が不要でリスト処理が簡単にできる、 っていう程度の理解しかないからかも知れないのですが、 「リスト処理が得意 => 画像処理が得意」という短絡な答えではないですよね? Lispと画像処理を結びつけた解説や記事はありませんか?
画像処理とはちょっと違うが、CGといえばシンボリックス(LISPマシン)という時代があった
今、LispのインタプリタをCで書いてるんですが、 お勧めの本とかありますか? あとLispのメーリングリストってないんでしょうか? 探しても見当たらないんですが...
awklisp
lisperならここを読んどけっていうblogあったら教せーて。 とりあえず Planet Lisp と shiro さんとこは読んでます。
blog じゃないけど comp.lang.lisp と meme.b9.com/start.html はたまに見てる。
>>123 さんくす。とりあえず comp.lang.lisp 読んでみるわ。
あと、deliciasとかはてブのlispタグあたりから面白そうなものを
書いているとこ探してみます。
おもしろそうなところ発見したら報告よろ。
(format t "...") で、" を出力するにはどうするのでしょうか?
>>126 こういうこと?
(format t "\"")
+ - * / 等の ANSI SPEC サポート関数のオーバーロードの方法を知りたいのですが。 例えば、+ を計算しつつ演算が全計算中で何回行われたか等を my_add みたいな関数を定義する事なしにカウントしたいのですが、 どうすればいいのでしょうか?
普通の関数を再定義するのと変わらんと思うが。
こういうのって合法なの? (let ((old #'+)) (defun + (&rest numbers) (message (format nil "~S" numbers)) (apply old numbers)) )
132の言ってる[合法]ってのが何のルールに対してなのかわからないけど まともな処理系でcommon-lispパッケージで定義されてるものを再定義しようとすると 警告なりなんなりが出るとおもう。参考までにACLでやるとこんな感じ↓ Error: Attempt to make a function definition for the name +. This name is in the common-lisp package and redefining it is a violation for portable programs. Replacing the current definition of #<Function +> may be dangerous. The package common-lisp has package-definition-lock set, which causes the system to signal this violation. [condition type: package-locked-error] 関係ないけどファンクションのオーバーロードなんてできないよね?再定義だよね? ジェネリックファンクションじゃないんだから。131の意見をもっと詳しく聞きたい。
134 :
131 :2006/07/30(日) 11:19:05
>>133 俺はSchemeの人なのでCommonLispはさっぱりわからん。
(Schemeもそれほど使いこなせてないけど。)
通りすがりに
>>130 の回答が的外れに思えたので言ってみただけ。
130の回答がすべてだと思う。
λ... λ... λ...
137 :
デフォルトの名無しさん :2006/08/18(金) 09:46:52
javaのムスタングというバージョンにはスクリプトをVM上で実行できる 機能がつくらしいが、lispを動かすことはできるのだろうか??
できる
今でも ABCL とか、JVM 上で動く Lisp はあるけどね。
140 :
デフォルトの名無しさん :2006/08/19(土) 02:58:47
>>139 アレ重すぎる。面白そうだから少し使ってみたけど
weblogicと同じくらいメモリを消費するってのがちょっと・・・
WebLogic と同じくらいとかゆわれてもピンとこないなー。それは例えば他の JVM で動作するスクリプトと比較してどうなの?まぁ、大抵のスクリプト言語 はインタプリタだろうからその分は差し引かないといけなさそうだけど
142 :
デフォルトの名無しさん :2006/08/20(日) 00:37:54
@で紹介されてたやつ? もしlispが動く処理系がJVMに組み込まれたとして、何が出来るだろう? ぱっと思いつくところとしてオブジェクト全部javaで切って置いて、 外部ファイルにlispでアプリの動作を定義するというDIみたいなものだろうか。 rhinoみたいにjavaで書かれていてなおかつ手軽にlispで遊べるtoolないもんかな〜〜
>>141 ABCL を動かしてみた。起動時のメモリ使用量は
Rhino: 10MB
ABCL : 20MB
だった。重すぎるかねぇ?
>>143 今どき目くじらを立てるほどではないと思う
Common Lispを勉強中なのですがどうしても理解できない部分があります。 (1 2 3)などと入力した場合エラーになるのに (defun hoge (p) p)という関数を定義して (hoge (list 1 2 3))などとした場合エラーにならないのはなぜなんでしょうか? 関数の本体が実行される前に引数が評価されてp イコール (1 2 3)になるのなら エラーになると思うんですが・・
>>145 (1 2 3) と (list 1 2 3) は違う。後者を評価したものが前者になる。
言い方を変えると前者はデータ、後者はプログラム(=評価される式)。
プログラムを書くべき場所にデータを書けば当然プログラムとして評価される。
つまり 1 という関数を呼び出してエラーになる。
147 :
145 :2006/09/20(水) 19:31:10
うーん 難しい・・ もし(defun hoge (a)(+ a 1))という関数を定義したとして (hoge (+ 1 2))という風に呼び出すとすると 関数の本体が実行される前にまず(+ 1 2)の部分が評価されて3になりますよね。 その後3がaに結び付けられて関数の本体(+ 3 1)が評価されて4を返すと思うんですが 145の例だと関数の本体の部分のpが評価される前に引数の(list 1 2 3)が評価されて (1 2 3)になった後(1 2 3)がpに結び付けられて関数の本体の部分のpつまり (1 2 3)が評価されるならやはりエラー になるはずなのにならないのがまだ理解できないです。
>>147 (1 2 3) が評価されるわけじゃなくて p が (1 2 3) にバインドされている状態で p が評価
される。その結果の値は (1 2 3) になる。
149 :
145 :2006/09/20(水) 19:54:07
あっ つまりバインドするというのはpという箱に(1 2 3)を入れるのではなくて (1 2 3)がある部分をpが指し示すようにするってことなんですね。 やっとわかりました。ありがとうございます。
(1 2 3) => "1" と言う名前の関数として評価 => エラー (list 1 2 3) => "list" 関数として評価 => リストオブジェクト '(1 2 3) == (quote (1 2 3)) => (1 2 3) を評価せずそのままオブジェクトとして返す => リストオブジェクト
>>146 の
| 言い方を変えると前者はデータ、後者はプログラム(=評価される式)。
は変に感じるな。両方ともデータだし、同時にプログラムでもある。
ただ前者は「正しくない」プログラムだけど。
>>150 の表記は気持ち悪いねぇ…
オレだけか(w
'(a b 1 2) っていう表記に、自分の中でしっくり来ないものを感じたから、考えた。 (class-of (car '(a b c))) #<BUILT-IN-CLASS SYMBOL> (class-of (car '(1 2 3))) #<BUILT-IN-CLASS FIXNUM> alphabetの方は解かるんだけど、数字の方が`1'っていうsymbolじゃなくて、 なんで数値型になるのかが自分には引っかかるみたい。で、下の物を評価してみた。 (class-of (quote 1)) #<BUILT-IN-CLASS FIXNUM> 数字って、quoteしても、無視なんですね。知りませんでした。 ↓こうしたら、symbolにできた。 (class-of (quote |1|)) #<BUILT-IN-CLASS SYMBOL> ;;↓あと、ためした物 (class-of (quote .1)) #<BUILT-IN-CLASS SINGLE-FLOAT> (class-of (quote 1/2)) #<BUILT-IN-CLASS RATIO> (class-of (quote #C(1 3))) #<BUILT-IN-CLASS COMPLEX> (class-of (quote #*010)) #<BUILT-IN-CLASS SIMPLE-BIT-VECTOR> ;; lisp expertのかた、この程度ですんません。
>>153 (class-of '1a)
(class-of '1e)
(class-of '1e1)
なんてのも面白いぞ。
要するに数値として解釈できるものは数値になる。
竹内郁雄先生の初めての人のためにLISPを読んで勉強中なんですが マクロの所でどうしてもわからないところがあります。 162pでcondを (defmacro mycond (&rest clauses) (expand-cond clauses)) (defun expand-cond (clauses) (mycond ((null clauses) nil) ((eq (caar clauses) 't) (cons 'progn (cdar clauses)) ) (t (list 'if (caar clauses) (cons 'progn (cdar clauses)) (expand-cond (cdr clauses )) )))) と定義しているのですが、マクロcondのなかでexpand-condを評価し、 そのexpand-condのなかでまたマクロcondを評価してまたそのなかでexpand-condを・・・ という風に評価のループ状態になってしまうのではないでしょうか? (実際xyzzyで試してみたらスタックフローオーバーになりました
>>155 expand-condの定義でmycondを使うのはまずいな。
condを使うか、ifか何かで書き換えるかするよろし。
なぜか空白が表示されなかったorz (defmacro mycond (&rest clauses) (expand-cond clauses)) (defun expand-cond (clauses) (mycond ((null clauses) nil) ((eq (caar clauses) 't) (cons 'progn (cdar clauses)) ) (t (list 'if (caar clauses) (cons 'progn (cdar clauses)) (expand-cond (cdr clauses )) ))))
何度もすんませんorz
>>156 つまりexpand-condのなかでは自分で定義したmycondを使うのではなく言語に
もとから実装されているcondを使う、ということなんでしょうか?
(defmacro mycond (&rest clauses)
(expand-cond clauses))
(defun expand-cond (clauses)
(mycond ((null clauses) nil)
((eq (caar clauses) 't)
(cons 'progn (cdar clauses)) )
(t (list 'if
(caar clauses)
(cons 'progn (cdar clauses))
(expand-cond (cdr clauses )) ))))
160 :
158 :2006/09/23(土) 01:25:09
>>119 うーん・・本に書いてある例↓だと158の例のmycondになってる部分(マクロの定義でもexpand-condの中のでも)
condになっているんですがこれは本のプログラムが間違ってるということなんでしょうか?
(defmacro cond (&rest clauses)
(expand-cond clauses))
(defun expand-cond (clauses)
(cond ((null clauses) nil)
((eq (caar clauses) 't)
(cons 'progn (cdar clauses)) )
(t (list 'if
(caar clauses)
(cons 'progn (cdar clauses))
(expand-cond (cdr clauses )) ))))
>>160 「初めての人のためのLISP」、書庫から探してきた。162ページだよね。
えっと、condのような特殊形式はマクロで再定義してはならないことになっているんですわ。
だから竹内本の例はCommon Lispとしてはcondをマクロとして定義している時点で正しくない
ということになる。(本の中のプログラムは正確な例ではなく概念的な説明なのだと思う)
162 :
158 :2006/09/23(土) 02:33:22
>>161 condの再定義自体してはいけないということなんですね
仮にmycondを定義するとしたら例のどこを修正したら良いのでしょうか?
ループになってる部分をなんとかしたら自分にも理解できそうになると思うのですが・・
>>161 expand-condの中でmycondを使わない。ifで書けばよい。
expand-condが返す式の中では使ってもよい。
(ただし、その中でmycondに渡す引数が元のclausesより短くならないといけない)
164 :
158 :2006/09/23(土) 22:18:18
>>163 難しそうですがとりあえずチャレンジしてみます。
ありがとうございました。
lambda式について質問なんですが #'と'の違いは何なんでしょうか? applyに渡すときは'#+でも'+でも大丈夫なのに (setf (symbol-function 'hoge) #'(lambda (x) (+ x 2)))が大丈夫で (setf (symbol-function 'hoge) '(lambda (x) (+ x 2)))がエラーになるのは何故なんでしょうか?
' は quote で #' は function の省略形。 クロージャをつくるときは #' ということでヨロシク。
ちなみにANSI Common Lispでは (lambda 〜) の前の #' は省略できることになっている
169 :
165 :2006/09/24(日) 16:19:50
うーん 難しい・・ そもそもapplyにシンボルで渡している場合でも apply本体の中での第一引数が指してる物は関数の実体ではなくて 関数の名前ですよね 関数の名前を指してる変数しか持っていないのにどうやって関数を指すことが できるようになるんでしょうか? つまり (setq a 'b) (setq b 'c) でaしか持ってない時にaを何回評価してもbにしかなりませんよね。 (つまりapplyの場合関数の名前しか手に入らない) それでb、要は関数の名前を評価してc、つまり関数の実体を得る事をapplyはどうやって 行ってるんでしょうか?
>>169 シンボルにはその関数定義を入れる箱が付属している。
その箱の場所を取り出すのが symbol-function なのだ。
171 :
165 :2006/09/24(日) 17:15:05
>>170 つまり大雑把に言うとapplyの中ではまず第一引数が指してるのが
'lambdaか#'lambdaチェックして
'lambdaだったらapplyのなかでさらに(apply (symbol-function 第一引数) '(第二引数))
を呼び出して#'lambdaだったら(apply 第一引数 '(第二引数))を呼び出すという
イメージでいいんでしょうか?
細かいことにこだわる自分にとって独学でLISP勉強するのはきついよ(つД`)
>>171 むしろ向いてる気がするんだけどね。「定義?仕様?実装を見ろッ」という
のは楽なんだけど,時々自分が悪いのかそれとも地雷踏んだのか悩むし
function designator:
1. シンボル ;; グローバル環境で関数名を表わすシンボル
2. 関数 ;; #'foo とか (lambda (...) ...)
と定義されているのでー手元の SLIME で試すとこんな感じ
CL-USER> (defun フゥゥ () 'グローバルフゥゥ)
フゥゥ
CL-USER> (flet ((フゥゥ () 'ローカルフゥゥ)) (apply 'フゥゥ ()))
グローバルフゥゥ
CL-USER> (flet ((フゥゥ () 'ローカルフゥゥ)) (apply #'フゥゥ ()))
ローカルフゥゥ
>>174 あと日本語の情報がすくないのも英語が苦手な自分にとってはきついっす
fletの意味が竹内先生の本にもポールグレアムの本にも載ってなかったので
flet Lispとかで検索してみたんですが英語のページばっかりでdefunとの違いがよくわからないorz
>>175 日本語のきちんとした説明が欲しいなら CLtL2 日本語版は買う価値があると思う
fletは一時的に局所的な関数を定義するときに使う。 (flet ((関数名1 借り引数リスト1 局所関数本体1) (関数名2 借り引数リスト2 局所関数本体2) .... (関数名n 借り引数リストn 局所関数本体n)) 関数本体) 例. CL-USER> (defun foo(x) (flet ((sq (arg) (* arg arg))) (sq x))) FOO CL-USER> (foo 10) 100 CL-USER> (sq 10) ; ←sqはflet内部の局所関数なためエラーになる。
また同じ構文の関数で labels と言う物がある。 flet では定義した局所関数は同じflet内の他の局所関数では使用できないが、 labels では使用できるところが違う。 例. CL-USER>(defun foo(x) (labels ((sq (arg) (* arg arg)) (qtl (arg1) (* (sq arg1) (sq arg1)))) (qtl x))) FOO CL-USER>(foo 10) 10000
179 :
175 :2006/09/25(月) 18:04:35
>>177 ,178
関数内で関数を定義できるということはlambdaとほとんど同じ意味で
名前をつけるので自分で自分を呼び出せる(再帰できる)というのが
lambdaと異なるという考えでいいんでしょうか?
labelsで定義すると再帰できるが、fletは再帰できない。 lambda関数に比べてfletとかで定義した関数が便利なのは、 funcallを付けずに呼び出せるとこ。
flet と labels の違いは局所関数名が局所関数の定義の lexical environment
に含まれるかどうか
>>178 > flet では定義した局所関数は同じflet内の他の局所関数では使用できない
できる
(flet ((myevenp (n e o)
(if (= n 0) t
(funcall o (1- n) e o)))
(myoddp (n e o)
(if (= n 0) nil
(funcall e (1- n) e o))))
(myevenp 11 #'myevenp #'myoddp))
=> NIL
>>180 > fletは再帰できない
できる
(flet ((factor (f n r)
(if (= n 1) r
(funcall f f (1- n) (* n r)))))
(factor #'factor 5 1))
=> 120
ややこしー・・・
まあ kludges, 1-971 な言語だからねえ。
funcall や apply にシンボルを渡せる、てのも便利な場面はなくはないだろうけれど。
scheme の方が初心者がはまりそうな穴は少ないかもしれんね。
>>181 気持ちはわかるが入門スレでそこまでつっこむのは如何なものか。
でも細かい事が気になるらしいし、
>>181 はやさしいよ。
個人的には、細かい事が気になったら書き出しておいて、言語に慣れた後で調べた方がいいと思うけど。
今知るべき事とそうではない事を切り分けて、かつ分からない事を記録して行けば、
再起出来る出来ないなんていう理解の仕方ではなく、
>>局所関数の定義の lexical environmentに含まれるかどうか
というより本質的な理解を自力で出来るようになるはず。
>>184 単に関数やマクロの使い方の説明をするだけでなくて、竹内先生の本のような
動的変数や環境とか束縛等の根っこの方の説明や、簡単な処理系の作り方を説明してるような
本はないでしょうか?
やっぱりGuy L. Steele Jrのあの高い本買うしかないのかなorz
>>185 そういう本とはちょっと違うけど、CLtL2は良いよ。
第1版の時代からだから20年前から読んでるが、久しぶりに開くと今でも新しい発見がある。
>>181 はパラメータで関数を渡してるし「やればできる」だろ…
普通再帰するときは↓のように labels つかうんだし
(labels ((myevenp (n)
(if (= n 0) t (myoddp (1- n))))
(myoddp (n)
(if (= n 0) nil (myevenp (1- n)))))
(myevenp 11))
訳がすごく悪い(間違いだらけで学生にやらせた感がヒシヒシ)だけど培風館 の Lisp も全部読めばイイ本だよ.GC を作る例題とかあっていかんじ.英語が がんばれるなら原書のほうがオススメだけど. リアルオススメは Norvig の PIAP だな.Scheme や Prolog のインタプリタ, コンパイラが例題にでてくるよ.コードも数ページ程度の短かいので動くから おもしろいし.学生時代に読んだんだけど当時 Lex とか Yacc とか聞いたこと もないド素人だったけど辞書片手にちょこちょこ読んだだけで普通に簡単なコ ンパイラが作れるようになった.
>>188 s/PIAP/PAIP/
Norvigは教科書書かせたら神だよね。
190 :
185 :2006/09/27(水) 06:11:13
やっぱり日本語の本でいいのは無いのかなorz PAIP面白そうですが一万円・・・うーん
しかしNorvigはPythonに行ってしまった... うーみゅ
まったく Norvig Norvig と女々しい奴だな? こないだインタビューで好きなものは Python と Lisp ってゆってたYOOO
クロージャを使ってOOPを実装することができる。 レベル(レイヤ)の違う話なので、どういう点が異なるのかと言われても当惑する。
>>194 まあクラスから「関数+隠蔽された変数」という概念だけを取り出したものだと思ってくれてもいいかも。
オブジェクト指向やってた人からするとなんか貧弱なものに見えるかもしれんけど
Lispの他の機能とあわせればそれだけで困らんの。
データを持っている関数 → クロージャ 関数を持っているデータ → クラス こんな理解の仕方であってますか?
>>197 そんな感じだね。(記号化して理解した気になるのは多少危険だけど)
クラスってのは型の定義でしかないんじゃないか? 関数がクラスに属するかどうか、データ隠蔽を行うかどうかは言語ごと (というかオブジェクトシステムごと) の違いだよねえ。
>>197 適当な言語でクロージャそのものを勉強すればいいのに、
「クロージャとはどういうものか」しか理解しようとしないから
いつまでたってもわかんないんだと思うが。
超簡易的な俺Lispとか実装してみると その辺わりとガッチリした実感が得られるんじゃないかな
質問者には多分環境という概念が存在しないと思うんだよな。 そんなものがない世界の頭のままでクロージャとは〜とか言ってても あんまりよくわからないと思う。 って、また「環境って何ですか」とかやられてもかなわないんで それはやっぱり、そういうのがある言語を勉強してねってことで。
Peter SeibelのPractical Common Lispを読んだことのある人いますか? CHAPTER8でわからない箇所があったので意見を聞きたいのですが
205 :
203 :2006/10/03(火) 20:53:35
93Pに (do-primes (p 0 19) (format t "~d " p)) というマクロ呼び出しがあるんですが どうして(0 19)ではなくて(p 0 19)なんでしょうか? わざわざpなんていう変数をわたさなくても doの先頭でpを宣言してそれを使えば良いと思うんですが・・・
hygienic にしておいた方が使いやすいから
単純な例ならともかく実用を考えると パッケージ関係でややこしいことになりかねないしね。
208 :
205 :2006/10/04(水) 12:06:48
よく見たらbodyの部分でpを使う必要がありましたねorz
Practical Common Lispのスパムフィルタよーわからん。 カイ2乗が出てくる辺りから。
Lispプログラムの実行について質問なのですが Cなどだと実行ファイルを作成したら後はそれをクリックして実行するのが普通だと思うんですが Lispの場合 処理系を起動させる→定義のロード→関数をタイピングして実行する という流れが基本なんでしょうか?
>>210 「クリックして実行」はウィンドウマネージャの機能だから、言語とは関係無いよ。
好きなようにやれば良い。
>>210 はい。
タイプする代わりに処理系の引数で式を与えて評価させることもできるので
#!/bin/sh
sbcl --eval '(load "/path/to/hello.fasl")'
みたいなスクリプトなどを用意すれば独立した実行ファイルみたいに見えます。
多くの処理系では関数を実行する一歩手前の定義をロードした状態を
ファイルに保存し、次回その状態から起動することもできます。
sbcl --core my-program-defined.core --eval '(my-program:run)'
みたいに。
使ったことはありませんが、商用の Allegro Common Lisp とかだと
独立した実行ファイルを生成することもできるのではないでしょうか。
213 :
210 :2006/10/09(月) 12:34:33
>>211 ,212
212さんの挙げている上の例だとコンパイル済みのファイルをロードして評価する
というのを引数にしてsbcl実行時にあたえるということだと思うのですけれども
いろんなLispのプログラムを見てみたんですが一番最初に呼ばれる関数、
つまりCでいうmain関数のような物はどうやって定義するのでしょうか?
あとWinXP+clispで勉強をしているのですが文法の説明ではなく処理系自体の使い方を
説明した本やサイトなどはないでしょうか?
clispのマニュアルを読んでみたんですがイマイチよくわからないですorz
>>213 main相当をやる方法は処理系依存も含めていろいろあるが、基本的にはトップレベルで
関数を呼び出せばそのまま実行されると思えばよい。
君の疑問に対する答えの多くはclispのマニュアルに書いてあるから、ちゃんと読むのが
良いだろう。
215 :
デフォルトの名無しさん :2006/10/09(月) 13:43:33
CommonLispを勉強する理由は?
いかすから
いかれてるから
218 :
217 :2006/10/09(月) 14:01:08
もちろん良い意味でね。
219 :
デフォルトの名無しさん :2006/10/09(月) 15:45:49
最近出た「入門Common Lisp」っていう本はどう?
括弧のお化けだ
221 :
212 :2006/10/09(月) 16:03:04
>>213 lispってのは、基本的に書かれていることを頭から順に実行するだけです。
それは、対話的環境でもファイルでも同じ。
ファイルがコンパイルされていてもいなくても同じ。
loadは「ファイルを読み込んでそれを実行する準備」では《なく》、
「ファイルを開いて中身を順に実行する」という操作です。
少しぐぐってみましたが
http://cs.gmu.edu/~sean/lisp/LispTutorial.html の Loading and Compiling Lisp の項などは多少参考になるかも知れません。
色々実験して体得してください。
>>219 Lispをよく知らないプログラマ向けの教養本としてなら可。
情報系の学生にとってはゴミ。って感じでした。
>>221 > lispってのは、基本的に書かれていることを頭から順に実行
Scheme等では必ずしもそうではない。
CommonLispスレだからCommonLispのことを指しているんだろうけど、
"lispってのは"という風に一般論にするのは好ましくないと思う。
224 :
デフォルトの名無しさん :2006/10/09(月) 17:33:10
方言がありすぎる、 何を始めたらいいのかわからん
225 :
210 :2006/10/09(月) 17:52:38
>>221 なんとかワンクリックでロード、実行ができるようになりました。
ありがとうございます (´;ω;`)
>>223 「基本的に」と言ってるんだからScheme等にも当てはまると思うが
>>227 うーん。Lispの思想かなぁ。あまり賛成できない。
229 :
デフォルトの名無しさん :2006/10/09(月) 22:58:51
一番使われている方言は何?
>>229 マジレスすると emacs lisp、そして lisp としては最悪。
真面目に勉強するなら Common Lisp でいいんじゃねーの?
最近「practical common lisp」とか本も出てるし。
>>222 おれは非情報系だから、ラムダ計算のとこだけ面白かったよ。
そんな思想ないから。
いまどきは実行ファイルをクリックして実行させるのが普通なのか・・・ 如何にしてforkしてexecするか、ってのが本質だと思ってるのはCUI環境で育ったジジィだけ? lispに関係ないから下げとくね。
実行ファイルをクリックしたってforkしてexecするという本質は同じですよ。 (OSが違うとシステムコールの流儀は多少違うけど) 変わったのは人間様がどう接するかという部分だけ。
>>210 マジレスすると、 SLIME とかの統合開発環境を使うのが Lisp では(少なくと
も Common Lisp では)一般的だ。エディタでかいて、ダブルクリックで実行し
て…というサイクルでも開発できるけど、たぶん面倒だと思う。
LispWorks みたいにエディタ、対話環境 (REPL)、その他ツールが一体になって
るのが普通。 Windows で CLISP だと Emacs + SLIME って手があるね。
ttp://lispuser.net/commonlisp/clisp.html
みなさん、Schemeではプログラミングしないんですか? Common Lispのほうがいいんですか?
Schemeは自閉症気味。徹底的に綺麗に書いてやろうというモチベーションのときは
Schemeの方が好きだけどとにかく仕事を片付ける為に使うとか、ドロ臭い実戦投入には
Common Lispの方が向いてると思う。Gaucheくらいライブラリ充実してると話は別だけど。
デバッグ環境の強力さとかプロファイラの充実っぷりではまだCommon Lispの方が上だと思う。
ペチじゃないChezとか商用の強力そうなScheme使ったことない漏れの個人的見解なんで
猛者の反論を待つ。
>>236 は両方使ってみて気に入った方を使えばいいのでは。どっちも似たようなもんだし(って書くと怒られそうだけど)
少なくともLisp以外の言語から比べたらどっちも似たようなもんだわな
好みで良い希ガス
* (macroexpand '(lambda (x y) (cons x y))) #'(LAMBDA (X Y) (CONS X Y)) * (lambda (x y) (cons x y)) #<Interpreted Function (LAMBDA (X Y) (CONS X Y)) {483AC071}> * #'(lambda (x y) (cons x y)) #<Interpreted Function (LAMBDA (X Y) (CONS X Y)) {483ACA31}> * #'cons #<Function CONS {104FE6F1}> * ((lambda (x y) (cons x y)) 1 2) (1 . 2) * (#'(lambda (x y) (cons x y)) 1 2) エラー * (#'cons 1 2) エラー 納得行かねー。
>>240 入門レベルなので解説できないけど、↓のヒントにならない?
(funcall #'cons 1 2)
(funcall #'(lambda (x y) (cons x y)) 1 2)
(funcall (function cons) 1 2)
http://www.lispworks.com/documentation/HyperSpec/Body/03_abab.htm >If the car of the compound form is not a symbol,
>then that car must be a lambda expression,
>in which case the compound form is a lambda form.
ってことで、式の car 部はシンボルかラムダ式じゃなくちゃいけない。
で、((lambda (x y) (cons x y)) 1 2) は lambda form と解釈されるので、
その時点で car 部にある (lambda ...) という式はマクロ展開されない。
つまり、((lambda (x y) (cons x y)) 1 2) -> (#'(lambda (x y) (cons x y)) 1 2) ではない。
また、(#'foo ...) -> ((function foo) ...) であり、これは不正な式になる。
まあ、(lambda ...) -> #'(lambda ...) ってマクロは余計なお世話だよなあとは思う。
> 式の car 部はシンボルかラムダ式じゃなくちゃいけない。 なんと。 > その時点で car 部にある (lambda ...) という式はマクロ展開されない。 ななんと。 > また、(#'foo ...) -> ((function foo) ...) であり、これは不正な式になる。 そうか。なるほどこれは確かに。 いや、((symbol-function 'cons) 1 2)も試したんですよ? でもそれを認めると評価して関数になるものでよければ 変数でもいいじゃねーかということでschemeになっちゃうか……
典型的な Lisp-1 vs Lisp-2 だね。あまりにも頻繁に議論になるので経験長い
人は耳タコでしょう。それぞれメリット、デメリットがあるので「どっちが優
れている」という事はない。どっちが好みか、という事だね。
以下、ニュースグループからの抜粋。
例:
Lisp-1 (((f x) y) z) vs Lisp-2 (funcall (funcall (f x) y) z)
Lisp-1 のほうが圧倒的に読みやすい、というなら Scheme を試してみるのがい
いかもしれないね。Lisp-2 では名前は関数名以外の使用法もあるので。
例:
(defclass person ()
((name :accessor name)))
(defmethod m ((p person))
(with-slots (name) p
... (name p) ... ; the accessor
... name ...)) ; the slot
Lisp-2 より Lisp-1 のほうが好みで、Common Lisp 処理系でも Lisp-1 を実現したいなら
↓のように arensi ライブラリ附属の lisp-1 マクロでも使うといい。
(with-lisp1 ;; Lisp-1 にしちゃうマクロ
(let ((a +))
(a 2 3))) ==> 5
http://groups.google.com/group/comp.lang.lisp/browse_thread/thread/82994055009163e9
コードの可読性という意味では funcall が必要という流儀は嫌いではないな
間を取ってfuncallの名前を短くすればいいんじゃね? fとかに。
callでいいよ
Allegro Common Lispを使って、グラフィックを描きたいのですが(単純に線を引くだけでも)、何をどうすればよいのかも分かりません。 全くの初心者で申し訳ないのですが、何かよい参考書のようなものはないでしょうか。
ACLチュートリアルでいいじゃん
252 :
デフォルトの名無しさん :2006/10/13(金) 19:36:48
age
253 :
デフォルトの名無しさん :2006/10/19(木) 23:38:33
lispの入れ子構造についての質問なんですけれども C言語と違ってたとえば (defun fact(N)(cond ((equal n 0) 1) (t (times N(fact (sub1 N))))) だとIF文にあたるcondはどういう挙動になりますか?
式の通りになります
>>253 もういちど国語を勉強して、普通の論理読解力・記述力を身につけような。
この先の人生できっとペイするから。
普通の読解力が無いから たぶんこの展開を「イジメられた」と解釈するだろう。
^^;
>>253 よ。もうちょっと聞きたい事を詳しくゆってくれ。
がんばって推測してみた。
1. (equal n 0) なら 1 を返す
2. それ以外なら (* n (fact (1- n))) を返す
という挙動をする。この場合だと IF とほとんど同じだね。
C: if (n == 0) {
return 1;
} else {
return n*fact(n-1);
}
LISP:
(cond ((equal n 0) 1)
(t (* n (fact (1- n)))))
あるいは
(if (equal n 0)
1
(* n (fact (1- n))))
…こゆ事を聞きたいのかね?それとも return が無いとかそんな話だろうか。
>>253 本人に出てきて貰って何が聞きたかったのかしっかり解説して貰いたい。
Common Lisp には関数 times も sub1 も無いんだからスレ違いだわな
カタいこというなよ。どうせ他にネタもないんだし、超能力を鍛えようぜ。
.NETでうごかせるLisp言語ってないですか? 非常に興味あるんですが、今までのライブラリも捨てがたす・・・(・ω・)
>>263 過去スレに色々出てるから見られたら見てみるよろし。
CommonLispって、何から勉強したらいいの?
268 :
デフォルトの名無しさん :2006/10/30(月) 21:12:19
CLISP for Win32の日本語の使い方.HTMLにある例のソースパスの 部分を修正しdot.emacsに追加しています。 ところが読込で下記のエラーで前に進みません。 Symbol's function definition is void: pushnew Takashi Hiromatsu さんのNTEmacs上で動かしています。
>>268 lispuser.net にある奴?俺んとこでも emacs -q で起動したら再現したな。
pushnew の行の前で↓の行を足せば ok。
(require 'cl)
だれか中の人に報告よろしく。
271 :
デフォルトの名無しさん :2006/10/31(火) 08:43:53
270さん、ありがとうございます。 これで、「やさしいLISP入門」酒井皇治著の勉強が出来ます。
CMUCL の読み方ってどう読むんですか? 普通に、「シーエムユーシーエル」ですかね?
クミュクル
かーねぎめろんゆにばーしてぃこもんりすぷ
275 :
デフォルトの名無しさん :2006/11/01(水) 01:11:44
setqとsetの違いを教えてください。
不正確だが雰囲気的に近い表記をすると、 (setq x v) ≡ (set (quote x) v) 【実際には set の対象にできるのは大域変数だけ】 正確には (set s v) ≡ (setf (symbol-value s) v) と定義されている
>>269 すいませんすいませんすいません
そのままの姿勢でもうしばらくお待ち下さい
よっしゃ。ちょっと辛いけどこのままの姿勢で待つよ。
おれは検索しやすくemacsでみやすいtexソースを常備>OnLisp
>>277 章とかページが入るべきとこにvoxとかfooとか書いてあるんだけど、
ラベルの付け忘れみたいなもん?
章ではそうなってないはず,ページですよね? \label とかするのめんどくて.
283 :
デフォルトの名無しさん :2006/11/04(土) 00:13:26
なぜこんな古い言語を勉強するのですか?
>>282 「2.9 コンパイル」の最後に「第foo章を参照」ってのがあるけど。
>>283 古いけど、発展が止まってるわけでもないので、
現状に合わないってこたないよ。
>>283 言語が古いと何か困ることがありますか?
>>284 ありゃ,本当ですね.でも他には少ないはずです.
適宜 原文に当たって下さい.(そこで指しているのは7.9節のようですね)
>>283 C++やRubyにはない機能を標準搭載しているから.
すなわち処理系の動作をプログラミングできる「マクロ」.
今必要なのは新しいCommonLispの仕様だ! より巨大化してナウい言語に成長するんだ!
よし、俺が設計してやろう
2ch初のLisp処理系を
ここは入門スレと銘打ってるからどうだかわからないけど、 他のLisp系スレの住人なら、半数くらいは自作の処理系持ってそうだな。 勿論、公開に耐えるほど作り込んでいる人は一部だろうけど。
すべての仕様を取り込んだ処理系ってあるの?
すべての仕様を取り込まないとCommon Lispとは呼べません
294 :
デフォルトの名無しさん :2006/11/04(土) 17:57:55
どの処理系を使用してますか? 私はxyzzyに内臓してるやつです。
clisp
>>294 それは(このスレ的には)偽物だぁああああああ
CLISP とか GCL とか CMUCL とか SBCL とかフリーの本物はいくらでもあるぞおおおおおお
>>296 え、xyzzyは偽物なの?
CommonLispじゃないの?
ずっと使ってたよ。
>>297 偽者っていうと語弊があるかもしんないけど、
規格を半分も満たしてないみたいだよ。
xyzzy のは Common Lisp に近いけど違うね 方言の一種というか。
xyzzy の Common Lisp 準拠率は6割程度ってどっかで見た気がする。 まあ似たような系である Emacs Lisp と比べれば はるかに Common Lisp に近いと思うけどね。
蟹と蟹カマくらい違うな
勉強するのにはxyzzyでもいいと思うよ。
>>302 俺はそうは思わんな。初心者こそちゃんとした処理系で勉強しないと本を読んだりしたときに
混乱するだろう。xyzzyで勉強するのは自由だが、あれをCommon Lispだと思ってここで質問
したりするのはやめてほしい。
本物の蟹が無料で食べられるのに、わざわざ蟹カマを食べる必要はないと思う。
xyzzy は偉大なソフトウェアだと思う。あれを個人で作ったというのは けっこうとんでもない作業で Common Lisp の実用性を示す良い例だ。 でも 開発環境としては現状 Emacs + SLIME や LispWorks Personal の ほうが充実してると思う。 SLIME の移植もしたいけど、なかなか時間がとれないなぁ。
偉大なソフトウェアかどうかと、Common Lispかどうかは独立した命題だ。 Common Lispでないのだからxyzzyはスレ違いだと思う。 少なくともCommon Lispの勉強にはCommon Lispのほうが適すると思う。
入門レベルなら好きなのでいいんじゃねぇ?
CLisp + Meadowでやってますが、何か問題ありますか? みんなは?
入門者ですが、Emacsで、slime + SBCL/CLISPでやってます。 SBCLとCLISPは、Lispboxに入ってるやつ。 主にSBCLですが、slime-autodoc-modeの表示がCLISPよりわかりやすいので。
310 :
デフォルトの名無しさん :2006/11/05(日) 17:07:39
入門CommonLispの通りに設定しても、Meadow上でCLispが動きません。 誰か教えてください。
もっと詳しくかきなさい、どんな設定をしたのかとか
「入門CommonLisp」を持ってない人のほうが多いことに気が付こうね
ここにいる一定数が読んでることが期待できるCommon Lispの本なんて GrahamのANSI Common Lispくらいじゃない? PCLはどうなんだろう。俺は3/4くらいは読んだけれども。
特定の本についてのスレではないのだから、本の内容に関連する質問ではその 内容についても簡単に説明するのが礼儀というものだろう
ここでエスパーの登場
ごめん俺サイコキネシスしか使えない
あれは簡単だからな
俺、公文で習ったよ<サイコキネシス
むしろ魔法使い級のlispハカー登場↓
竹肉だが。何の用かね?
↑偽物キター!
彼は本物の竹肉だよ。 Mock Turtleみたいなもんだ。
323 :
デフォルトの名無しさん :2006/11/11(土) 00:31:12
Lispの使い道がわなんない。
コンピュータの使い道と同じですよ
>>323 こ、これはカスプと呼んで差し支えないのでせうか・・・
327 :
デフォルトの名無しさん :2006/11/14(火) 02:23:01
指定されたファイルに書かれている整数を、逆順に表示するプログラムをつくるにはどのようにすればよいのでしょうか? 例えば、123 456 78 と入力されると、 78 456 123 と表示されるようなのです。
大筋だと 1. ファイルを開く 2. 数字を一個読込む 3. リストに cons する (以下、入力がなくなるまで 2. -> 3. を繰りかえし) 4. cons して作ったリストを先頭から順番に表示してゆく cons については教科書か配布資料かぐぐる様に聞け。答はホレ。 (defun answer-327 (filename) (with-open-file (s filename :direction :input) (do ((i (read s nil :eof) (read s nil :eof)) (lst nil (cons i lst))) ((eql i :eof) (format t "~{~A~^ ~}" lst))))) 宿題なら「今迄習った関数」「授業の教科書」くらい教えてくれんと、 範囲外の機能を使ってしまってパクリがバレバレになるかもしれんよ。
329 :
デフォルトの名無しさん :2006/11/17(金) 03:11:34
Common Lisp入門者なんだけど関数リファレンスってみんな hyperspecとかをみているの? なにが標準なのかよくわからなくての質問なんだけど
CLtl2とhyperspecでおk
>>331 CLOSが無いのはCLtL初版。CLtL2はCLOSは入ってるよ。
ANSIとCLtL2の差分はさほど多くない。(例えば lambda マクロ)
処理系が多すぎるから普及しないんじゃないの?
どうやったら減らせると思う?
多いと言っても、選択肢になるのは商用なら Allegro か LispWorks、 フリーなら CLISP か SBCL くらいに収束してきてるんじゃないかな。
SchemeはLispの処理系には数えないの?
…ここは Common Lisp スレだからな
C言語とD言語くらいの違いはあるからな
lispの凄いオープンソースプロジェクトがでる下地はだいぶ整ったよな でも現実は開発者が集まらないからか、全然もりあがってる風がないな
どこ見てるのかわかんねーけど、個人プロジェクトを除外しても SBCL、 Maxima、 SLIME あたりは結構活発だよ。おっかけるだけでも結構大変だもん。 SLIME とか Edi Weitz がネットニュースに投稿した SLIM がベースにボランティアが発展させた 典型的なオープンソースプロジェクトだと思うけど。
341 :
デフォルトの名無しさん :2006/11/26(日) 15:17:40
JAVA6ではスクリプト言語がVM上で動かせるようなナルトのこと。 lispを訴える最後のチャンスです!!
普通 CL をスクリプト言語とは言わないんじゃないかな。 そのチャンスとやらは Scheme に任せる方向で。
>>340 いや、それらをlisper以外が使うかね?
Rails 見ろ。正直すごいとは思わないけど、注目をあつめてruby人気を牽引してる。
… Rails って Rubyist 以外が使うのか? Web アプリ用のフレームワークなら 個人的には Perl の Jifty のほうに注目してるけど。手軽な Web アプリを目指すなら あのくらいの割り切りがいいんじゃないかなぁ。 それはともかく Maxima は Lisper 以外のユーザーのほうが多いんじゃないかな。 俺の周りでは数学系の人が Mathmatica と一緒に使ってるつーパターンが多いね。 セットアップを頼まれる事はあったが俺のようなプログラマは自分ではめったに使わない。
345 :
デフォルトの名無しさん :2006/11/26(日) 21:50:25
lambda 式に対する #' の用途がいまひとつよくわかりません。 (defun make-adder (x) (lambda (y) (+ x y))) も (defun make-adder (x) #'(lambda (y) (+ x y))) も 同じように動くように見えます。(CLISP)
>>345 Common Lispの規格改訂で同じように動くようになったのだ。
ANSI Common Lisp以降、(lambda ...) は #'(lambda ...) に展開されるマクロ
として定義されている。
本質的にはfunction特殊形式という奴なので、#' を書くのが正書法と言えるかな。
それは
>>332 がいってる ANSI Common Lisp で導入された LAMBDA マクロと
いうものだよ。なんでも ANSI Common Lisp 標準化の際に ISLISP を ANSI CL
で実装するための互換レイヤーとして導入されたそうだ(ネタ元: Practical Common Lisp)。
(lambda (y) (+ x y)) はこのコンテキストだと (funcation (lambda (y) (+ x y))) に展開される。
だから実質 #' を書くのとかわらない。こっちも (funcation ...) に展開されるからね。
#' で書くほうが統一されてていいんじゃね。Practical Common Lisp でも #' は全部につけてるよ。
348 :
347 :2006/11/26(日) 22:10:58
うぎゃぁ。かぶったうえに俺のほうがクドい… 346 に嫉妬!!
349 :
345 :2006/11/26(日) 22:18:39
>>346 へぇー。なるほど。ありがとうございます。
ところで CommonLisp では #' してない生の lambda 式の評価結果って何なのですか?
;; Elisp では (consp (lambda (x) x)) => t で、ありゃぁ…って思いますたが
350 :
345 :2006/11/26(日) 22:20:49
>>347 あ、行き違いでした。詳しい解説ありがとうございます。
Emacs Lisp でも (funcall (byte-compile (lambda () (list (consp (lambda ())) (consp #'(lambda ())) (consp '(lambda ())))))) => (nil nil t) だよ。lexbind では closure が導入されてるからバイトコンパイルしなくても 同様なんじゃないかな。
>>349 ANSI以前のCommon Lispではエラーだと思う。lambdaという関数が無いぞ、みたいな。
353 :
346 :2006/11/27(月) 00:33:16
>>348 いえいえ。ISLISPとの関連は知らなかったので勉強になったよ。
もうちょっと流行るかと思ったんだけどな。>ISLISP
さすがに3つも標準(方言)は要らんということか。
354 :
345 :2006/11/27(月) 01:21:39
>>351 >>352 どうもです。
ああ、なるほど。バイトコンパイルすると、関数オブジェクトになるんですね。
この方面で最初に触ったのが Scheme だったので、
Common Lisp や Elisp の lambda が、いまいひとつしっくりきませんでした。
355 :
347 :2006/11/27(月) 01:22:00
フフフ。入門スレから解答しまくってるんだが、
>>331 では CLtL2 と CLtL を取り違えるという
失態をおかした後だったんでね。とりあえず
>>332 と
>>346 は勝手にライバル視。
しかしなんだ。あんたも ISLISP に期待してたのか。俺も OpenLisp とかインストールしてたクチだぜ。
あと EuLisp とかにも期待してたよ。継続、軽量プロセス(スレッド)あたりに。懐しいなぁ…。
PHウィンストンのLisp読んでみたいと思ってるんだけど いくら探しても<2>の方しか見つからないorz 通販で<1>が買えるところってないでしょうか?
357さんが挙げているのと自分が探してるのは版が違うっぽいですが、 どんな差があるんでしょうか? <1>+<2>と357さんが挙げてるのでは200ページぐらい量が違うみたいなんですが
あーそれ良い入門書だよね。日本語版は訳が微妙でストレスがたまったけど。
>>356 アマゾンのマーケットプレイスに時々出てくるから、マメにチェックするといいよ。
図書館で借りて読むってのも手っとり早いと思う。
i < 原書で買えば一冊にまとまってる上に訳に悩まされる事がないらしいぞ
PCLですら文が難しいと感じるぐらい英語苦手なので 原書だと厳しいです(´;ω;`) 361さんのいうとおりアマゾンにでてくるのを気長に待とうと思います。
原書読んだりするのも慣れの問題だからね。避けてると一生読めないよ。 Lispだけでなく英語の勉強にもなるから一石二鳥だと思って原書読むのをお勧めする。
わかりました、がんばってみます(´;ω;`) うまく訳せないところがあったら聞いていいでしょうか?
364ではないけど、どうぞ。 できればいちいち日本語に訳さなくても意味がとれるよう頑張れ。 文意がよくわからないところは腰を据えて訳すのも一つの方法だけど。 英語の本を読むのは、最初の一冊は大変だよね。 最初の一冊で名著とかある分野のバイブル的な教科書にあたるものが読めると いい経験になる。
ありがとうございます。 このスレには親切な人が多いなあ(´;ω;`)
368 :
デフォルトの名無しさん :2006/11/30(木) 17:35:31
いちいちツラ文字いれんなうぜえ
ヒント: ISBN ヒント: 出版社名
>>365 がんばれ。SICP よりは格段に脳味噌酷使レベルが低いから初チャレン
ジにはいいぞ。わからん事はがんがん聞いてくれ。たとえ途中で力尽きても、
なにもしないよりは遥かにマシだからな。
374 :
363 :2006/12/01(金) 19:31:34
ではお言葉に甘えて早速・・・
PCLの38ページ中ほど
ttp://www.gigamonkeys.com/book/syntax-and-semantics.html のBreaking Open the Black Boxから少し進んだところにある
In Common Lisp things are sliced up a bit differently, with
consequences for both the implementer and for how the language is defined.
の文がどういう意味なのかよくわかりません。
コンマで区切られた前半のほうはCommon Lispの場合はちょっと事情が異なる〜
みたいなことを言ってるんだと思うんですが、後半のほうはさっぱりわかりません。
訳すとしたらどのような風になるんでしょうか?
>>374 Common Lispの場合、実装から見ても言語の定義から見てもちょっと事情が違う。
376 :
363 :2006/12/01(金) 19:55:58
>>375 (直訳)Common Lispの場合少し事情が異なる、実装と言語がどのように
定義されたかの両方の結果として
をこなれた文にすると
Common Lispの場合、実装から見ても言語の定義から見てもちょっと事情が違う。
という文になるという考えでいいでしょうか?
うーん。難しい・・・
>>376 これ以上は英語の勉強になってしまう気もするが、直訳の因果関係が逆。
「異なる分け方をしている」→「実装方法と言語の定義に影響を与える」
まああまり細かいことは気にしないで読み進めていけばいいんじゃないだろうか。
なんて言ってる俺も実は読んでる途中だったりする。
378 :
363 :2006/12/01(金) 22:21:11
>>377 どうもwithとかasみたいな曖昧な前置詞や一つの文の中で,が何度も出てくると
文の構造がよくわからなくなってしまうみたいです。
次のよく意味がとれない文なんですが
PCLの40ページ中段あたり
ttp://www.gigamonkeys.com/book/syntax-and-semantics.html のS-expressionsとS-expressions As Lisp Formsの中間あたりにある
Two important characteristics of the way the reader translates names to
symbol objects have to do with how it treats the case of letters in names
and how it ensures that the same nameis always read as the same symbol.
の文章なんですが how it treats the case of letters in names をどう訳せば
良いのかよくわかりません。lettersは文字という意味なのかと思ったんですが
名前の中にある文字のケース ではさっぱり意味がわかりません
どういう風に訳せば良いんでしょうか?
ちょっとひとつひとつの単語(特に前置詞とか)に神経質すぎると思う。 英語なんて気合いだよ。w ちなみに文字のケースというのは大文字・小文字の区別のこと。
380 :
363 :2006/12/01(金) 22:44:12
>>大文字・小文字の区別のこと そんな単純なことだったんですねorz ちなみに今は1ページ読むのに最低30分かかってるんですが 年内までに読み終わることができるんだろうか・・・
381 :
363 :2006/12/03(日) 02:36:35
PCL52ページに (defun verbose-sum (x y) "Sum any two numbers after printing a message." (format t "Summing ~d and ~d.~%" x y) (+ x y)) という関数の定義が載っているんですが、 format関数の中でどうして~%が使われているんでしょうか? 試しに削った状態で関数を呼び出しても同じ結果になるんですが、 どんな意味があるんでしょう?
383 :
363 :2006/12/03(日) 03:09:48
>>382 えと、~%の意味(改行する)は知っていたんですが
どうして~%を削って(verbose-sum 1 2)のように呼び出しても
"Summing 1 and 2" 3
という結果にならずに
削らなかったときと同じ
"Summing 1 and 2"
3
という結果になってしまうのかがわからなかったんです。
削っても削らなくても同じ結果になるならなぜ~%をわざわざつけてるんだろうか?と
説明不足ですみませんでした・・
>>383 君の使っているCommon Lispの処理系は評価値をプリントする前に (fresh-line) を
(内部的に)実行する仕様になっているのだろうね。
385 :
363 :2006/12/03(日) 03:47:55
1 "Summing〜 を出力する 2 (+ 1 2) が評価されて3という値になる 3 REPLに出力する前に行の先頭にいなかったら改行する 4 3を出力する たぶんこんな感じなんですね。 よくわかりました、ありがとうございます。
386 :
デフォルトの名無しさん :2006/12/03(日) 05:38:42
Windows用のGNU CLISPでexeファイルが出力できるというので clisp -c test.lisp -l test.exe とやってみましたが実行すると 「NTVDM CPUがエラー検出したました」 と出て終わってしまいます。 なにがまずいのでしょうか?
青汁
質問なんですが、LispでOSを書く事って出来ないのでしょうか?
HSPなら書ける。マジレス。
なるほど、こんな夜中にすぐレスが付くとは。
じゃあlispでOSを書く場合、JAVAでOSを書くみたいに、
Cでlispインタプリタを作って実行させるのが良いのでしょうか?
Lispでx86のネイティブコードを吐かせるコンパイラって無いのでしょうか?
>>389 HSPって何ですか?
調べたけれど、lispと関係有るのでしょうか?
OS作ろうってんなら、コンパイラくらい先に作れ。
末尾再帰を最適化してくれる Common LISP の処理系って どんなものがありますか?
396 :
デフォルトの名無しさん :2006/12/03(日) 10:39:05
CLISPってwinのexeつくれないんですか?
作れます。ドキュメントを読んでください。
sbclについて質問させてください。 a.outやELFのようなファイルを作ることは可能でしょうか。 *.faslや、それをsb-executableで変換したものは出来たんですが、 後者は #!bin/sh からsbclを呼んでいるようですし...。
399 :
398 :2006/12/03(日) 12:46:19
>394 私はへたれなんでよくわかりませんが、ちょうど昨日末尾再帰で 1億回のループ(ループというのは正しくないかも)を試したところ だったので書いてみます。 clispはスタックオーバーフロー、sbclは2秒程度でできました。
400 :
デフォルトの名無しさん :2006/12/03(日) 12:53:11
英語がよくわかりません。
>>398 % sbcl --eval '(save-lisp-and-die "hello" :toplevel (lambda () (princ "hello, sbcl") (terpri) 0) :executable t)'
This is SBCL 1.0, an implementation of ANSI Common Lisp.
More information about SBCL is available at <
http://www.sbcl.org/ >.
SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses. See the CREDITS and COPYING files in the
distribution for more information.
[undoing binding stack and other enclosing state... done]
[saving current Lisp image into /tmp/hello:
scanning space for lutexes...
writing 1912 bytes from the read-only space at 0x10000000
scanning space for lutexes...
writing 1936 bytes from the static space at 0x30000000
scanning space for lutexes...
writing 23666688 bytes from the dynamic space at 0x48000000
writing 11 lutexes to the core...
done]
% ./hello --noinform
hello, sbcl
% file ./hello
./hello: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), dynamically linked (uses shared libs), not stripped
>>395 以前試したときの記憶では、CLISPは末尾再帰は必ずしも最適化されなかったような。
403 :
398 :2006/12/03(日) 16:19:12
>>399 どんなコードだったかを秘密にする意図はなんですか?ただの末尾再帰なら
CLISP でも動くよ。だめならループつかえばいいのに。
[1]> (defun foo (n) (if (= n 100000000) t (foo (1+ n))))
foo
[2]> (compile 'foo)
foo ;
nil ;
nil
[3]> (foo 0)
t
末尾再帰で書いていないに一票
406 :
398 :2006/12/03(日) 19:11:12
私は (compile 'hoge) をしてませんでした。 これによって挙動が違うんですね。 ;; clisp [1]> (defun hoge (x) (if (= 0 x) nil (hoge (- x 1)))) HOGE [2]> (hoge 100000000) *** - Lisp stack overflow. RESET sbclは大丈夫っぽい ;; sbcl * (defun hoge (x) (if (= 0 x) nil (hoge (- x 1)))) HOGE * (hoge 100000000) NIL
それはコンパイルしないとインタプリタで実行されるからだよ。バイトコード にコンパイルされる時に最適化が効くようになってる。コンパイル時に最適化 するデバッグとかするときにね。 SBCL はコンパイラのみなので、いきなりコンパイルしちゃって最適化されてる。 インタプリタ実装されてるよ。まだデフォルトじゃないけど設定でインタプリ タも使えるようになるよ。
408 :
398 :2006/12/03(日) 19:27:47
おお、ありがとうございます。勉強になります。 >394 混乱させるような事を言ってすいません。
SBCL 1.0 ならもう入ってるのでインタプリタ使いたければ↓のようにしてくれ。 つうか Scheme から来た人? CL は「いつも必ず末尾再帰を最適化する」じゃない ので適宜ループとか使ったほうがいいよ。 CL-USER> (setf SB-EXT:*EVALUATOR-MODE* :INTERPRET) :INTERPRET CL-USER> (defun foo (n) (if (= n 100000000) t (foo (1+ n)))) FOO CL-USER> (foo 0) Control stack exhausted (no more space for function call frames). This is probably due to heavily nested or infinitely recursive function calls, or a tail call that SBCL cannot or has not optimized away. [Condition of type SB-KERNEL::CONTROL-STACK-EXHAUSTED] Restarts: 0: [ABORT-REQUEST] Abort handling SLIME request. 1: [TERMINATE-THREAD] Terminate this thread (#<THREAD "repl-thread" {D08EBE1}>)
410 :
363 :2006/12/03(日) 20:09:16
次の意味がよくわからない文なんですが
PCLの59ページ
ttp://www.gigamonkeys.com/book/functions.html Functions As Data, a.k.a. Higher-Order Functionsの真上にある文全体を要約すると
1 たしかにRETURN-FROM関数の引数に返る関数の名前を書くのはしんどい。
関数の名前を変更したら同じようにRETURN-FROM内で使われてる名前も変更しなくちゃいけない。
2 でもLispではCから派生したreturnステートメントよりも明示的にRETURN-FROMを指定するほうが
多く使われる場合がある。
3 何故ならloop等の制御構造を含む全てのLisp式は評価されると値になるから。
4 だから実際はそんなに問題じゃない。
という風に訳せたんですが、いまいち3の部分がよくわかりません。
どうして制御構造を含むLispの式を評価すると値になる事と
1に書かれている事がたいした問題ではないことに繋がるんでしょうか?
C だと値を返すには return をしないといけない。 ↓ Lisp では制御構造を評価すると勝手に値が返るのでいちいち return をかか なくてよい ↓ だから return を書くのが多少面倒でも実質的に問題にならない(C と同等の 意味なら return そもそもを書く必要がないから)
412 :
363 :2006/12/03(日) 20:47:58
>>411 よくわかりました。ありがとうございます。
どうも文の中にあるmuch less(はるかに少ない)を(言うまでもなく)と
間違って訳したせいで意味がまったく逆になってたせいみたいです。
2の正しい訳は
× RETURN-FROMのほうが多く使われる
ではなくて
○ C系の言語でRETURN文が使用されるほどにはLispではRETURN-FROMは使用されない
ですねorz
413 :
398 :2006/12/03(日) 21:38:27
>409 確かにそうなりました。ありがとうございます。 clispもsbclもこうなっていたのか > コンパイルされる時に最適化が効くようになってる。by 408
414 :
398 :2006/12/03(日) 21:39:09
あれ、by 407だった。
415 :
407 :2006/12/03(日) 22:43:05
>>398 「常に末尾再帰は最適化されるべき」と考えるあたり Schemer だと思うけど、
CL やるときは頭を切り替えたほうがいいよ。この辺 C から入った人なんかだと
「コンパイルする == 最適化」が普通だと感じるようだけど。
Common Lisper なら高機能な loop 構文ですよw
417 :
デフォルトの名無しさん :2006/12/04(月) 01:11:53
WINのCLISPで実行ファイルを作るにはどうすればいいのでしょうか?
418 :
デフォルトの名無しさん :2006/12/04(月) 01:42:19
コンパイルした実行ファイルで標準出力に文字を出力 するにはどの関数を使えばいいのでしょうか?
write-char
420 :
デフォルトの名無しさん :2006/12/04(月) 02:52:23
*.fas を windows用のexecutableにするにはどうすればいいのですか?
421 :
デフォルトの名無しさん :2006/12/04(月) 04:36:45
CLISPで単にWINのDOS窓用のexeを作りたいのですが (SAVEINITMEM "test" :EXECUTABLE t) とやるとCLISPのインタプリタまでつくられてしまいます。 Cやhaskellみたく普通のexeは作れないのですか?
422 :
デフォルトの名無しさん :2006/12/04(月) 04:47:12
インタプリタ、じゃなかった。 対話形式の実行環境、とでもいいましょうか。
(quit)
424 :
デフォルトの名無しさん :2006/12/04(月) 14:03:12
できるようになりましたが 全部4メガバイトになっちまいます。 しかも他のPCに持っていくとDLLがない、とかいういつものやつで。 やっぱりLISPってなんだかな〜
425 :
デフォルトの名無しさん :2006/12/04(月) 14:10:04
言語と処理系を一緒にするなよ アホ
426 :
デフォルトの名無しさん :2006/12/04(月) 14:18:15
一緒にして考えろよタコ
結局
>>424 の最後の1行が書きたいだけのキチガイ君でしたね。
皆様の放置プレイがGJです。
428 :
デフォルトの名無しさん :2006/12/04(月) 18:19:10
DLLがない、とかいういつものやつ いつものやつ ???
430 :
デフォルトの名無しさん :2006/12/04(月) 21:15:48
普通のやつらの上を行きたいので、 オモチャの笛で電話機をハックするところから始めようと思います。
キャプテンクランチ キター
432 :
363 :2006/12/04(月) 22:38:19
次の意味がよくわからない文章なんですが PCLの73ページ Dynamic, a.k.a. Special, Variables の最後の方にあるダイナミック変数についての説明 1 Dynamic bindings make global variables much more manageable, (訳)動的束縛をつかうとグローバル変数がもっと便利になる。 2 but it's important to notice they still allow action at a distance. (訳)しかし離れた所からのアクションをまだ許可していることに気づくのは大切です。 3 it can change the behavior of downstream code,and it also opens the possibility that downstream code will assign a new value to a binding established higher up on the stack. (訳)ダウンストリームとは?? 可能性を開く?? 4 文章略 (訳)動的変数を使うときはこれらの利点が必要なときのみにすべきでしょう。 2の文章もいまいち良く訳せていないみたいなんですがそれよりも3の文章が問題で 4の文章からすると3で動的変数の利点を説明してるみたいなんですが、 ダウンストリームという言葉を辞書で調べても下流のという意味にらしく 3の文章とどのように組み合わせるのかがいまいちよくわかりません。 3の文章はどういうことを説明してるんでしょうか?
ここでいうdownstream codeってのはその束縛の中で実行されるコードで、 let文の中だけでなくそこから呼ばれる関数も含んだものを指している。 > Dynamic bindings make global variables much more manageable, but it's > important to notice they still allow action at a distance. Binding a > global variable has two at a distance effects--it can change the > behavior of downstream code, and it also opens the possibility that > downstream code will assign a new value to a binding established higher > up on the stack. You should use dynamic variables only when you need to > take advantage of one or both of these characteristics. 動的束縛によりグローバル変数はずっと扱いやすくなる。それでも グローバル変数が離れた場所から操作できてしまう点に注意は必要だ。 [つまり、(let ((*global-var* hoge)) ...) とすると、 ... の中だけでなく そこから呼ばれた関数でも*global-var*をsetfできてしまうことを指している。] グローバル変数を束縛することは、2つの遠隔効果をもたらす。すなわち 一つは下流のコード [ 束縛したletの中、および、実行時にそこから呼ばれた コード。 ] の振舞いを変え得ることで、もう一つは動的束縛では下流のコードも スタックの上流で行われた束縛の値を変更することができるということだ。 この2つの性質のどちらかを利用する必要がある場合に限り、動的変数を 使うとよいだろう。
こういう質問のときは文脈がわかるようある程度のまとまりで切り出して もらった方が答えやすい。PCLはwebで見れたからいいけど、本だとそうはいかない。
アスペクト指向プログラミングって、EmacsのadviceとかCLOSのauxiliary method とかを後からねじこんだようなものかな?
436 :
363 :2006/12/05(火) 09:34:45
>>433 よくわかりました。ありがとうございます。
今日はいよいよマクロの章に突入だ。がんばるぞ(`・ω・´)
437 :
デフォルトの名無しさん :2006/12/05(火) 12:16:18
何で自分で調べないの?
めんどくさいからです。
面倒だからって他人に求めるのはどうよ? それくらい自分でやろうよ。
もうほっとけ
442 :
デフォルトの名無しさん :2006/12/08(金) 23:00:12
WIN用のGCLでOSのコマンドとか呼ぶ関数って 無いんですか?
何で自分で調べないの?
めんどくさいからです。
面倒だからって他人に求めるのはどうよ? それくらい自分でやろうよ。
もうほっとけ
おまえら・・・
448 :
デフォルトの名無しさん :2006/12/09(土) 05:26:40
LISPコミュって最高(プ
CやJavaで簡易な言語(というか設定用コマンド)をつくるときは、lex/yacc or JavaCCを使います。 一方で、Lispだったら、どうつくるのが常套手段なのでしょうか。 たとえば、以下のようなコマンドをlispで実装するのは? --------- copy file1 file2 move file1 file2 remove file1 ----- ちなみにyaccだとこんな風に書いていく。 list : | list cmn NL ; cmnd : COPY source target { action...} | MOVE source target {action...} ......
普通はさくっとrecursive-descentに書いちゃうんじゃない? parser generatorが使いたければcl-yaccとかもある。
設定用コマンドも S 式にすれば read() で ok
lisp スレだと "(w" の括弧が閉じなくてキモイ))
453 :
デフォルトの名無しさん :2006/12/09(土) 16:05:20
emacs+sbcl+slimeをインストールしました。
http://lispuser.net/memo/lisp/2006-12-08-03-54.html を実行しようとしてつまずいています。
slimeを立ち上げて、コードのバッファをslime-modeにして、
C-c C-cでバッファのソースをコンパイルして、.faslというものができたのですが、
これをどう実行するべきでしょうか?
また、C-c C-lでロードしたつもりなのですが、
slimeのreplで、(repl)と入力してみても、(init)が定義されていないといわれます。
initのリストの後ろでC-x C-eとやっているのですが。。。
>>453 パッケージが違うからだね。
CL-USER> (minilisp::repl)
もしくは、
CL-USER> (in-package :minilisp)
MINILISP> (repl)
で動くよ。でも元記事、どうみても書きかけなんだけどw
455 :
453 :2006/12/09(土) 16:27:05
>>454 起動できました。ありがとうございます。
本家のgoogleでPCLを検索すると、3番目にPeter Seibelさんが スピーチしてる動画があるんですが、どんなこと見たことある人いますか?
×どんなこと ○どんな内容なのか ですねorz
なんにでもカッコつけたがるのって あれだ、ほら ゴルフのスイングしてるオヤジとかギターのストロークの真似してる ニーチャンといっしょ。
よれよれスーツのオヤジとかアキバ系ファッションのニーチャンとか もう少しカッコに関心を持ってもいいんじゃないかと思うな。
わかりはじめたへたくそほどああいうことやるわね。
>>459 あえて「プログラマとか」って表現を避けてるなお前w
>>451 それこそ、lispスレならではの回答だな。
463 :
363 :2006/12/12(火) 16:42:47
155ページまでなんとか進んだんですが、また意味がよくわからない
文章が出てきました。
PCLの155ページ
http://www.gigamonkeys.com/book/beyond-lists-other-uses-for-cons-cells.html のSetsの少し上にある文章。
Where a cons cell in the original referenced an atomic value, the corresponding
cons cell in the copy will reference the same value.Thus,the only objects referenced
in common by the original tree and the copy produced by COPY-TREE are the numbers
5,6,and the symbol NIL
(訳)オリジナルのコンスセルが参照したアトム値は、対応するコピーされたコンスセルも同じ値を
参照します。従って、オリジナルのツリーとコピーされたツリーによって共通に参照される
オブジェクトは5,6,シンボルNILだけになります。
という風に訳したんですが、何度読んでもどうして5,6,NILだけが共通して参照されるのかが
よくわかりません。1,2,3,4,が共通して参照されないのは何故なんでしょうか?
共通して参照されると思うよ。 前半と後半が矛盾してるよね。後半が間違っているのでは。
漏れもerrata確認してみたけど該当する記述ないね。 Peterに直接訊いてみたら?
466 :
デフォルトの名無しさん :2006/12/13(水) 16:34:46
いつのまにかアレグロが8.0になっていた・・・ なんか簡為DBもついてくるようなので落として遊んでみるか
467 :
363 :2006/12/13(水) 20:45:31
>>464 ,465
うーん、やっぱり本の間違いなんですかね。
リーディング以上にライティングが苦手な自分にはApressにメールするには
勇気が入りますorz
fixnum は外部に実体が無いから「共通して参照される」ことはないよね。 とすると 5 6 が変なんだけど * 原稿では 5.0 6.0 になってたのが校正の段階で落ちてしまった * 5 以上は bignum として読んでくれということになってる (ざっと見た 感じではそのような指定は見付からないけど) みたいな感じなのかなあ。質問メール出すのがいいと思うよ。
日本語版出そうとしてる出版社ないのかな。もしあればそこを経由して伝えるのも手だ。
>>470 immutableな値でも概念的には「共通して参照される」で構わないだろう。
どのみちそんなことは話の本質にはなんら関係なく、的外れもいいところ。
fixnumだろうがbignumだろうが何かのクラスのオブジェクトだろうが、
copy-treeがそれを複製する能力を持たないという点だけが必要なのだから。
>>472 「概念的」だと曖昧過ぎるんで「言語仕様的」に落として
「共通して参照される」は相互に eq なオブジェクト
「複製」は相互に equal だけど eq でないオブジェクト
でいい?
>>467 #lisp に行ったついでに聞いてみたら
<jsnell> I don't see why 1-4 wouldn't be included
だってさ。やっぱ Peter にきくのがいいと思う。
俺の英語ですら通じてるみたいだし、何とかなるよ。
#lispって・・・なに?
477 :
363 :2006/12/15(金) 19:24:01
Apressに出すメールを↓のように書いてみたんですが 件名 Question to Practiacal Common Lisp 本文 There was a point that did not understand now though I was reading Practical Common Lisp. May I ask question on this point ? The point is a part of "Thus,the only objects referenced in common by the original tree and the copy produced by COPY-TREE are the numbers 5, 6, and the symbol NIL."on page 155. Why are not the numbers 1,2,3,4 referenced in common ? I am not good at English because I am Japanese... therefore I am afraid of not writting this Email well. But I think that this book is wonderful. And, it get me to send E-mail I'm looking forward to receiving reply. name addres こんな感じの文章で良いんでしょうか?
>>477 せっかくの2chだし、英語板にいって聞いてみるのがいいんじゃない?
>>474 SBCL デベロッパ就任おめでとうございます。
日本語が使えるようになって助かってまつ。
480 :
363 :2006/12/16(土) 20:34:32
書きかけで保存してたつもりがいつの間にか送信されてたみたいですorz それでPeterさんから返事があったんですが、やっぱり間違いだったそうで 後でerrataに追加するそうです。
すばらしー、ナイス480。 Peterからの返事いいなぁ。
Peterはgigamonkeyにメールすれば結構レスポンス良く返事くれるよ。 いますぐ回答できないから後でまた連絡するね、って返事がきたときは 大抵催促しないとその先の返事が戻って来ないけど。
483 :
363 :2006/12/21(木) 01:51:23
lispboxの中のpracticalsディレクトリにあるreadmeファイルの文章で よくわからない点があるのですが The code is designed to be loaded with Another System Definition Facility (ASDF) and each chapter directory contains its own ASD file. You can either add the name of each ChapterXX directory to ASDF:*CENTRAL-REGISTRY* or you can create symlinks to the ASD files in those directories in a directory that is already named in ASDF:*CENTRAL-REGISTRY*. If you also add this directory to the central registry or create a symlink to the file practicals.asd, you can then load all the practicals code by typing: (訳)そのコードはASDFでロードするようにデザインされてます。そして章ごとの ディレクトリも自分自身のASDファイルを持ってます。あなたはASDF:*CENTRAL-REGISTRY*に CHAPTERXXの名前を追加しても良いし〜(略)REPL上で次のようにタイプすることで コードをロードすることができます。 (asdf:oos 'asdf:load-op :practicals) という風に訳したんですが、ASDF:*CENTRAL-REGISTRY*とは一体何なんでしょうか? ファイルかディレクトリの名前かと思って探してみたんですがどこにも見つかりませんでした。
どっかにそゆパッケージがあるんだべ
>>483 なんでそこでASDFというモノを調べない……
487 :
363 :2006/12/21(木) 16:52:25
非標準のライブラリだったんですね CLtL2とかHyperSpecばっかり探してましたorz それで色々と試しているんですがよくわからない部分が出てきました。 WindowsとClispが入ったlispboxで試していて、 (asdf:operate 'asdf:load-op :practical)とタイプすると全てのソースコードがロードされて、 :practicalの代わりに個々の章のasdファイル名を入力するとその章のソースコードがロードされると といったことがREADMEに書いてあるんですが、特定の章の.asdファイルをロードしようと するとASERVEが見つかりませんといったエラーが出てしまいます。 エラーが出る章のasdファイルの中にある(require :aserve)が原因だと思うんですが、 どうすればロードできるようになるんでしょうか?
だったらその章を読めよ。そしたらAllegroServeに言及してあるのがわかるだろ……。 いやはや、ゆとり教育おそるべし。
489 :
363 :2006/12/22(金) 00:43:16
>>488 366ページに書いてありました。もう少し調べてから質問すべきでしたね。すいません
それで書いてある通りに(load "portableaserve-20051204.214932/INSTALL.lisp")と
REPL上で入力してみたんですが、ロードの途中で
READ from #<INPUT BUFFERED FILE-STREAM CHARACTER
#P"C:\\Program Files\\lispbox-0.7\\portableaserve-20051204.214932\\aserve\\main.cl"
@1525>: #1=#<PACKAGE SOCKET> has no external symbol with name "IPADDR-TO-DOTTED"
[Condition of type SYSTEM::SIMPLE-PACKAGE-ERROR]
というエラーが出て中断してしまいます。
main.clファイルの1525行目でexternされてないシンボルを使用してるのかな?
と考えて/acl-compat/clisp/acl-socket.lispの中を見てみたりもしたんですが
具体的にどうすればエラーが出なくなるのか検討もつきませんorz
環境は上で挙げたようにWindows+CLispのlispboxなんですが
誰か同じ様なエラーが出た人はいないでしょうか?
AllegroServe 使いたいなら ACL 8.0 Express 使うほうがいいんじゃない? SBCL でもいいけど、まず Lisp に慣れないと AllegroServe を入れられないよ うな気がする。CLISP だとシングルスレッドだから Aserve を起動したら SLIME とまっちゃうし。 # ちなみに ACL, LispWorks, SBCL と試したけど全部 OK だった
491 :
363 :2006/12/22(金) 20:15:04
492 :
cream :2006/12/29(金) 11:50:36
ビギナーです。 文字列:"abc"からアトム:abc を得る方法はあるのでしょうか? 欲しいのは、(#\a #\b #\c)や#(#\a #\b #\c)でなくabc です。 よろしくお願いします。
intern
(intern "ABC" :keyword)
495 :
cream :2006/12/29(金) 12:22:03
早速の回答、どうも有り難うございます。 おかげで問題が解消しました。
496 :
cream :2006/12/29(金) 13:09:26
intern の結果について少々質問があります。 CLISP での実行結果は以下の通りになっています。 前者の「あ」は期待通りでしたが、後者の「about」は前後には不要な | がついています。 これを無くすにはどうすればよいのでしょうか? 以上、よろしくお願いします。 [66]> (intern "あ") あ ; :INTERNAL [67]> (intern "about") |about| ; :INTERNAL
>>496 > これを無くすにはどうすればよいのでしょうか?
(intern "ABOUT")
499 :
cream :2006/12/29(金) 13:49:29
分かりました。 連想配列の car に about としていたところを |about| に変更したりすべきのようですね。 どうも、有り難うございます。
質問です。 lispは人工知能用の言語と聞きました。 でも、なかなか日本語に対応していないみたいです。 1、windowsで問題なく日本語を使える。 2、日本語を問題なく処理できる 3、インタープリタでなくバイナリをつくる。 そんな処理系って有りますでしょうか?
どの処理系を使ってダメだと思ったのか詳しく
haskellですけどghcは駄目でした。 試したわけではありませんが、テンプレを読んだ限り、 SBCLはSJISが使えない。 CLISPはバイナリがつくれない。 ABCLは良い感じですが、javaをインストールしないといけない。 Windowsでバイナリをはくlispの処理系って他に何が有りますでしょうか?
>>502 一行目を言いたいことがよく判らないので措くとしても、
用途というか目的が判らないので何とも言えないけれど。
実行効率が問題? それともユーザの環境の問題?
そもそもバイナリってネイティヴコードのこと? ……なら abcl は一応駄目だよね。
ていうか abcl がいい感じならそれでいいんじゃないかと思うのだけれど、
java をインストールできない事情でもあるのん?
まあ諸々措いて。
とりあえず clisp でスタンドアローンな exe は作れるよ。
http://clisp.cons.org/impnotes.html#image > :EXECUTABLE
> When non-NIL, the saved file will be an standalone executable.
> In this case, the #P".mem" extension is not added.
> On Win32 and Cygwin the extension #P".exe" is added instead.
sbcl も今は sjis 扱えるはずだよ。
http://article.gmane.org/gmane.lisp.steel-bank.devel/7820 それはそうと皆さん明けましておめでとう。
明けましておめでとうございます。
>>503 回答有難うございます。
出来たバイナリを配布したいんです。
で、プラットフォームはwindowsで、なるべく、「hogeをインストールしないと使えない」という
状態を避けたいんです。
バイナリはネイティブコードの事です。
clispはスタンドアローンなプログラム、作れるんですね。
有難うございました。
505 :
デフォルトの名無しさん :2007/01/03(水) 16:17:02
CLISPで文字列を数値に変える関数は何でしょう。 guy steeleの仕様書を読んでみましたが見つかりません。 AutoLispだとatoi Emacsだとstring-to-numberというのがあるようですが
506 :
デフォルトの名無しさん :2007/01/03(水) 16:31:56
わかりました。 (read-from-string "12345") とかやればいいんですね。
素晴らしい。
LALRとかってむずいよね
511 :
デフォルトの名無しさん :2007/01/15(月) 16:43:17
よく使うのに何の言葉の省略なのかわからない関数があるんですが letというのは何の略なんでしょうか?
省略じゃなくて、英語のletだよ。
(let ((it be))
(let ((us (go))))
ツンデ let
517 :
512 :2007/01/18(木) 01:17:59
>>513 シンプルに貸すっていう意味だったんですねorz
貸す?ココのletは英辞郎 on the Webでいう↓の意味だよ。 そのまんま一時変数の導入の為に使われるマクロの名前になってる。 【他動-3】 仮に〜としよう ・ Let x = 5, y = 7. 《数学》x を5、y を7としましょう。
そう言う問題じゃネーだろ
letは関数じゃないぞ
loopは関数じゃないぞ
Lispが広まらないのには括弧以外の理由があるのかもね。
他の手続き型programg言語で書いた方が楽な処理を S式で記述するとシンドイじゃない
>>523 ほほう。そうゆうものかな。参考にしたいので、なんか具体例だしてよ。
#!/Perl/bin/Perl $jane2ch_ini='E:/openjanedoe-0.1.12.2/JANE2CH.ini'; open(INPUT, $jane2ch_ini) || die "Couldn't open $jane2ch_ini for reading: $!\n"; @lines = <INPUT>; close INPUT; ($jane2ch_bak = $jane2ch_ini) =~ s/\.ini$/\.bak/i; rename($jane2ch_ini, $jane2ch_bak) or die "Couldn't rename $jane2ch_ini to $jane2ch_bak: $!\n"; open(OUTPUT, "> $jane2ch_ini") || die "can't open $jane2ch_ini for writting: $!\n"; foreach (@lines) { chomp; print OUTPUT $_; if (/^WrtCookie\s*=(.+)$/) { unless ($1 =~ /hana\s*=\s*mogera\s*;/) { print OUTPUT " hana=mogera;"; } } print OUTPUT "\n"; } close OUTPUT;
>>525 何が書いてあるのか俺には理解できないが、S式で書いてくれれば
一兆倍くらいはわかりやすそうだな。
perl -p -i.bak -e 's/^WrtCookie.*$/& hana=mogera;/' E:/openjanedoe-0.1.12.2/JANE2CH.ini こうか
# Haskell qsort: qsort [] = [] qsort (x:xs) = qsort elts_lt_x ++ [x] ++ qsort elts_greq_x where elts_lt_x = [y | y <- xs, y < x] elts_greq_x = [y | y <- xs, y >= x] # perl qsort: sub qsort { !@_ ? () : (qsort(grep { $_ < $_[0] } @_[1..$#_]), $_[0], qsort(grep { $_ >= $_[0] } @_[1..$#_])); } こういうのは、まだfunctionalな言語で書いた方が楽だな
;;; scheme qsort: (define (qsort lt? lst)   (if (null? lst) '()    (append     (qsort lt? (list-of x (x in (cdr lst)) (lt? x (car lst))))     (list (car lst))     (qsort lt? (list-of x (x in (cdr lst)) (not (lt? x (car lst)))))))) こうか… qsortに関してはperl版が一番好みだな、困ったことに
いけねぇlist-of使ってるのコピペしちまった...orz
;;; scheme qsort:
(define (qsort ls)
 (if (<= (length ls) 1) ls
  (let ((pivot (car ls)))
   (append (qsort (filter (lambda (n) (< n pivot)) ls))
           (filter (lambda (n) (= n pivot)) ls)
       (qsort (filter (lambda (n) (> n pivot)) ls))))))
こうだな、
ttp://d.hatena.ne.jp/MaD/searchdiary?word=*%5BScheme%5D
// C qsort: void qsort(int v[], int left, int right) { int i, last; void swap(int v[], int i, int j); if (left >= right) return; swap(v, left, (left + right)/2); last = left; for (i = left + 1; i <= right; i++) if (v[i] < v[left]) swap(v, ++last, i); swap(v, left, last); qsort(v, left, last-1); qsort(v, last+1, right); } これで十分いけてるやん
もっとスマートに行こうや # perl: sub qsort { @_ or return (); my $p = shift; (qsort(grep $_ < $p, @_), $p, qsort(grep $_ >= $p, @_)); } # python: def qsort(s): if len(s) <= 1: return s else: return qsort([x for x in s[1:] if x < s[0]]) + [s[0]] + qsort([y for y in s[1:] if y >= s[0]])
行の少なさではこれがチャンピオンか… qsort [] = [] qsort (x:xs) = qsort [y | y <- xs, y < x] ++ [x] ++ qsort [y | y <- xs, y >= x]
538 :
524 :2007/01/20(土) 21:28:10
よーわからん。別に S 式で書いてもシンドイとは思わんが・・・ (defpattern qsort () -> () (x . xs) -> (concat (qsort (list-of xs (lambda (y) (< y x)))) (list x) (qsort (list-of xs (lambda (y) (>= y x))))))
539 :
524 :2007/01/20(土) 21:49:35
あ、 一行野郎のほうか?そりゃ俺も Perl で書くわ…。 手続き言語つーより Perl の一行野郎への適性だろ。
>>538 ほーこう書けるんだ、参考になる
これならさほどしんどくないな
再帰の出る幕じゃない例をまな板に載せた方が もうすこしはっきりしたかもな
Schemeだと ((if true + -) 1 2) はOKなのに Common Lispだとできないのはどうしてなんでしょうか?
こうすりゃできる。 (funcall (if true #'+ #'-) 1 2) funcall を付けなきゃならん理由は、たぶん可読性がいいからだと思う。
>>543 可読性のためだったんですね。よくわかりました、ありがとうございます。
あと勉強のためのLispインタプリタを作ろうと思ってるんですが
前置記法じゃなくて中置記法にした場合、○○ができなくなる。
というようなことはあるんでしょうか?
可読性のためじゃない 普通のLispはcar部を評価しないから
Common Lisp では関数呼び出しの先頭はシンボル(関数名、マクロ名、スペシャルフォーム名)かラムダ式 じゃないといけないと規定されているから。 そうなっている理由は、それだとネストが深くなったら見難いとかだろ。 ((((foo) 1) 2) 3) 明示したほうがいい。 (funcall (funcall (funcall (foo) 1) 2) 3) まぁ、チームでやってるときに「開き括弧を数えてください」と「funcall の数を数えてください」のどっちが 言いやすいかって話だよな。 後者が許せないなら Scheme 使うほうがいいと思うよ。 どうしても Common Lisp で Scheme ライクにやりたいなら、方法は 1. Scheme コンパイラを書く 2. マクロでごまかす CL-USER> (defmacro with-542-form (expr) (if (and (consp expr) (consp (car expr))) `(funcall ,@expr) expr)) WITH-542-FORM CL-USER> (with-542-form ((if t #'+ #'-) 1 2)) 3 CL-USER> (with-542-form ((if nil #'+ #'-) 1 2)) -1
>>546 よくわかりました。
イメージとしてはSchemeのほうが文法の制限が多いと思ってたんですが
そんなことないんですね
>>544 中置記法ってのは中置記法のリーダを用意するってこと?それとも構文木を中
置記法表現にしたいってこと? Lisp 処理系は↓のような構成になるので、
リーダが文字列から構文木をつくる -> 評価器 (インタプリタ or コンパイラ) が処理
数式とかが扱いたい場合は、それ用のリーダを書いて内部的には前置記法で処理するのが定石。
MAXIMA とかが例だね。
>>548 定石通り中置記法で書いてそれを前置記法に変換するリーダを用意しようと
考えてます。
あと括弧もなるべく減らせる構文にしたいなあと思ってます。
それで前置記法でしか表現できない概念があるからLispは前置記法を採用してる
のかな?と思って質問しました。
前置記法なのはシンプルで強力で一貫性があるからだろう。
逆にわざわざ中置記法を採用するのは、慣れ以上の理由はないんじゃないか?
まぁ、自分の入門時の感覚を思い出せば、いいたい事はなんとなくわかる。
(+ 1 2 3 4 5 6)
1 + 2 + 3 + 4 + 5 + 6
とか?あと中置記法あと新しい演算子を考えたとして、結合規則とか優先順位どーするよ?
関数にするなら前置記法でいくね?みたいな。
まーまず不便に感じるだろうが前置記法をつかって LISP を作ってみてその
簡単さと一貫性を味わってみては。よろずやさんとこで放置プレイされてる
Lisp インタプリタとか、短いし、次回はマクロ機構をつくるとの事。
http://lispuser.net/memo/lisp/2006-12-08-03-54.html でもハッシュ使わずに alist でやったほうがいいような気がするなー
あと入門記事なら use-cl-function マクロは冗長に書いてほしかった。
いや面倒だったんだろうけどさ。
学生時代 Scheme 派だったんで読んだことあるよ。Scheme 作る本。一から解説されているが、 まず Scheme か Lisp を知ってる必要がある。 一応ここは Common Lisp 入門スレなので本スレのほうが喰いつきがいいと思うけど。
553 :
523 :2007/01/21(日) 00:54:26
今日はとても参考になった。d
554 :
デフォルトの名無しさん :2007/01/21(日) 16:27:48
abclがうごかない mustangでサンプル動かそうとしたが起動時にこける
kawaを使え
>>554 うーむ。もうちょっと情報をください。
clisp 2.41 + jdk-1.6.0 で abcl-0.0.0.9 ビルドしてみたけどちゃんと起動したよ。
>>556 eclipseでソースとりこんでそのまま動かしてる。
jarにしないとダメ・・・なわけはないとおもうけどなぁ。。。??
ごめん、jarに固めたら動いた・・・
quoteの意味で質問なんですが (defun hoge () (+ 1 2)) と定義して (list (hoge))と呼び出した場合、まず(hoge)が評価されて (list 3)になり、それから3がlistに渡されて(3)というリストが返されるという 順番で処理されていくと考えているんですが、それなら (defun hoge2 () 'a)と定義した場合 (list (hoge2))を呼び出すと (list a)となってエラーになるはずなのに、ならないのは何故なんでしょうか?
>(list a)となってエラーになるはずなのに、ならないのは何故なんでしょうか? これは「a が変数として処理されて、エラーになっちゃうはず」という意味で解釈して返事すると…… 実際は (list 'a) となる。 'a は変数として扱われないのでエラーにならない。 'a はシンボル型というもの。シンボル型っつうのは文字列の親戚みたいなもん。 (こんな説明したら他の人から怒られるか)
>>560 うーん、まだいまいち理解できません・・・
>実際には(list 'a)となる。
'aを評価するとaになって、↓のような順番に計算されていると思うんですが
'aを評価する -> aになり、それが返される -> aがlistに渡される(list a)
関数の最後の式を評価した値が、その関数の返り値となり、
そして'aを評価するとaになるのに、listには'aの値が評価されないままに
渡されてるのが理解できません。
こんな入り口で躓いてしまってるのが悲しいorz
>>559 > (list 3)になり、
そういう考え方をするなら、厳密には (list '3) と考えるべきだね。
たまたま '3 => 3 だから結果は同じになるだけ。
おおざっぱな規則としては、
(1)数値・文字列・配列などは評価するとそれ自身になる。
(2)シンボルは評価するとそのシンボルに束縛された値になる。
(3)リストの場合は、
(3a)先頭のシンボルが関数なら、その関数を呼び出す。
そのときリストの先頭以外をひとつずつ評価して、関数の引数として渡す。
(3b)先頭のシンボルがマクロなら、そのマクロを展開してその結果を再評価する。
(3c)先頭のシンボルが特殊形式ならそれなりのことをやる。w
ってなところかな。このくらい覚えておけば生きていけるよ。
>>562 つまり関数の最後の式そのものが、外側の関数の引数になると考えれば
いいんですね。まだちょっとモヤモヤしてるけど、理解できました。
ありがとうございます。
CLOSについて質問なんですが hogeというメソッドがあったとして、このhogeは 同じ数の引数しか取ることができないのは何故なんでしょうか?
そういう決まりだから
どちらかというと、いわゆる overloading よりも、ポリモーフィズムを意図して設計されている んじゃないかな。論理的に同じ意味を持った(だから使い方は同じ)関数を渡されたオブジェクト によって違う実装に導くのが主眼。 メソッドがクラスに隷属するスタイルの(現代の一般的な)オブジェクト指向言語とは元々の 考え方が違う。 あと、CLOS無しのCommon Lisp上のライブラリとして(CLtL1の核を変更しないで)実装できる ようにという歴史的な意図も多少あるかもしれない。
>>566 C++なんかのOOPが主語を軸においてるとすれば
CLOSは動詞に軸を置いているって感じなんですかね
もし正方形と三角形の面積を求める1引数のメソッドareaに
後になって立方体の面積を求める2引数のメソッドareaを追加したかったら
やっぱり既存のメソッドの定義を変更して、呼び出している全ての部分に
ダミーの引数を渡すしかないんでしょうか?
>>567 &optionalにすれば良いのでは?
定義は変えなきゃならんが、呼び出してるほうはそのままで済むと思う。
>>568 (defmethod area ((x cube) &optional y))
こんな感じにすれば良いんですね。
うーん でもできれば異なる数の引数でもメソッドが定義できる
ようになって欲しいな・・・
機能が明白に違うのだから違う名前を付けるべきだと思う
立方体の面積って、表面積のこと? 引数の数が変わる理由がいまいちわからんけど、自分だったら area-of-plane と area-of-solid って感じで別名にするかな。 メソッドは動的ディスパッチのために(つまりポリモーフィズムのために)効率が良くなるように 設計されている気がする。引数も違うってことは静的にディスパッチが前提だし、メソッド名も 変えたほうが可読性の点でも望ましいと思う。
動詞に軸を置いてるって以上に、同じ名前空間だから。 C++やJavaだとクラスが名前空間を兼ねているんで、 同じ名前がついていても全然別のもの。 STLでbegin、end等が共通してるのはユーザがそういう約束で注意して書いているだけ。 CLOSはそうじゃない。違うものには違う名前。 ここの「同じ」「違う」って概念がまたC++/Javaだと超適当だけど CLOSでは同じ外部仕様(引数の数とか)で働くもの、と厳密というか より計算機上の概念として考える。
CLOS のメソッド名って特定のパッケージに属するんだっけ?
たぶん CLOS 的なやり方に頭を切り替える必要がある。 (triangle:area x) と (cubic:area x y) とかするか、 型を定義してディスパッチしる。個数でディスパッチなんてだめぽ。 長方形の面積と立方体の面積の区別がつかないじゃん。 (defmethod area ((target <triangle>)) ...) (defmethod area ((target <cubic>)) ...) CLOS のメソッドは「引数の個数」よりも引数の型の組み合わせによるメソッドの特定。
>>558 Javaでlispが使えるとして何に使うんだ?
用途が思いつかないな。
思いつかない人は使わなければいいと思うよ
回答できないくせに自意識だけは強くて ついうっかりどうでもいい私見をなすりつけちゃいました
Java で書いた自作アプリに拡張性を持たせるために 何かしらのスクリプト言語(たとえばLisp)をつけとくとか? Emacs の elisp みたいなかんじ。 で、guile も tcl のリプレースとして、という話じゃなかったっけ。 最近どうなってるのかしらんが。
>>576 それ言い出すと、javascriptもrubyもpythonもhaskellもJavaで動くから
どうなのよ、という状態なんだが。これから何か出てくるんじゃないか?
現状だと Java の豊富なライブラリが Lisp から直接つかえる。 これはFFI 経由よりもお手軽なんで利点と嬉しいんじゃない。 あとは、いわゆる LL と違って CL は compile が規格に入ってるからね。 optimize の指定で JIT とか制御できるようなるとか夢は広がる。
defvarとdefparameterはどういう風に使い分けるものなんでしょうか? もう一度値をセットできるかどうかというのがどういった意味を持っているのかが よくわかりません
defparameterは定数だからコンパイラがコンパイル時の値で最適化していいんじゃないかな
>>583 空目しとるな。defconstant 定数定義。defvar と defparameter の違いだろ。
defvar と defparameter はダイナミック変数を定義する。
しかし、定義した変数の初期値の設定の仕方が異なる。 defparameter は評価するたびに
値を設定する。defvar は対象の変数名が「束縛されていない」場合のみ値を設定する。
ファイルをリロードしたときなんかに違いがでる。
CL-USER> (defvar x 10)
X
CL-USER> (setq x 1)
1
CL-USER> (defvar x 10)
X
CL-USER> x
1
CL-USER> (defparameter y 10)
Y
CL-USER> (setq y 1)
1
CL-USER> (defparameter y 10)
Y
CL-USER> y
10
585 :
585 :2007/01/28(日) 15:42:36
あぁ、使い分けの意味か。すまん。そのコードをリロードしたときにもう一度初期化 してほしい場合は defparameter 。稼働中で値を変更されたりすると困るようなのは defvar を使う。 いわゆる LL みたいに プログラム起動 → 終了 みたいな使い方だと defparamter のほうが直感的だったりするのかな?使い方によるけど状態をイメージに保存して使いつづける やり方だとプログラム修正しただけで状態まで初期化されると不便なんで defvar を使う。
586 :
582 :2007/01/28(日) 16:46:42
なんとなく違いがイメージできました。ありがとうございます
#'がある理由って一体何なんでしょうか? 最初は1つのシンボルが関数と値の二つを同時に持てたなら x -> xの値を返す 'x -> シンボルxを返す #'x -> xの指している関数を返す という風に使い分けをするためなのかと思ったんですが (setf x 10) x -> 10 (setf x #'+) x -> 関数オブジェクト #'x -> エラー となって1つのシンボルが同時に関数と値を持てないことがわかりました。 それなら何故applyのような関数を要求する関数には#'を付けた変数を渡すといった ルールをわざわざ作ったんでしょうか?
>>587 おそらくシンボルとそれに入っているオブジェクトを混同している。
ひとつのシンボルには「関数値」と「値」という2つのオブジェクトを入れる箱が付いている。
(setf x #'+) は関数オブジェクトを「値」のほうに入れてしまう。
「関数値」のほうの箱に入れたいならば、
(setf (symbol-function 'x) #'+)
とやらなければならない。
シンボルに #' を付けるとそのシンボルの「関数値」に入っているオブジェクトが取り出される。
applyのような関数にはそういうものを渡さなければならない。
>>588 とてもよく理解できました。わかりやすい説明ありがとうございます。
もう1つ質問なんですが
lambda式はそれ自体が関数名としてみることができるとどこかで読んだんですが
+ -> +
#'+ -> 関数オブジェクト
という風に+をそのまま評価したときは+がそのまま返るのに
(lambda () (+ 1 2)) -> 関数オブジェクト
#'(lambda () (+ 1 2)) -> 関数オブジェクト
という風に#'を付けても付けなくても関数オブジェクトが返るのは何故なんでしょうか?
上で言っているようにlambda式=関数名なら
(lambda () (+ 1 2)) -> (lambda () (+ 1 2))
という風になると思うんですが・・・
>>589 > (lambda () (+ 1 2)) -> 関数オブジェクト
> #'(lambda () (+ 1 2)) -> 関数オブジェクト
> という風に#'を付けても付けなくても関数オブジェクトが返るのは何故なんでしょうか?
前者は元々のCommon Lisp (CLtL1/2)ではエラーだった。現在の規格(ANSI)では
lambdaというマクロが定義されていて、後者と同じ意味になるようになっている。
おそらく #' を書くのが面倒くさいと主張する輩がいたのだろう。w
>>589 > lambda式はそれ自体が関数名としてみることができるとどこかで読んだんですが
どこで読んだか知らないけど、それは厳密には正確な理解ではないと思う。
おそらく概念的な説明だったのでは?
>>590 同名のマクロだったんですね。よくわかりました。ありがとうございますw
>>591 探してみたらPaul GrahamのANSI Common Lisp 23pでした
>ラムダ式は全体として関数名と見なせる。
それはフォームの先頭にラムダ式を書けるということじゃないの?
>>589 > + -> +
これって + がそのまま返ってるというより、直前に読み込んだ式が返ってるんでは?
Lispはあと30年は戦えますか?
まぁ30年後のLisperも、自分で言わなきゃ誰も言ってくれない哀しい優位性を 寝言のようにどこかでぶちまけてるんだろうなとは思う。
Common LispでSchemeのdefineやCの#defineのような 単純なマクロを使うにはどうすればいいんでしょうか?
単純なマクロとは?
>>598 #define HOGE foo-bar-baz
のような単純にテキスト置換をしてくれるような機能です
あまり使われない機能だけどシンボルマクロってのがある。 (define-symbol-macro HOGE foo-bar-baz) みたいな感じ
>>600 ANSIになって追加された機能みたいですね(CLtLには載ってませんでした)
ありがとうございます
setfについての疑問なんですが (setf 10 nil) とやるとエラーになるのに (defun hoge (x) (setf x nil)) (setq a 10) とやって (hoge a)とやってもエラーにならないのは何故なんでしょうか? xが10になるのでエラーになるはずだと思うんですが・・・
setfはマクロ(特殊形式かも)なので、第一引数は評価されない。 第一引数の場所に数値を書けば必ずエラーになるし、シンボルを書けば setqと同じ意味になる。
>>603 関数じゃなくてマクロなんですね
わかりました。ありがとうございます
gethashの引数はキー、テーブルの順なのに getの引数はシンボル、キーの順番なのは何か理由があるんでしょうか?
おそらく歴史的な理由
この手の引数の順序は大抵英語の目的語の順番であることが多い
Lispの処理系を勉強したいと思って CLispのWindows版をダウンロードしてみたんですが srcフォルダを見てもmain関数を探す以前にCのソースファイルすら見つかりませんorz このようなオープンソースのプログラムのソースを勉強する場合、 どういった方法でプログラムを読んでいけばいいのでしょうか?
お、やる気の人がきたね。CLISP の Windows 版についてるのは LISP ソース の一部だけだった記憶があるからソースの配布物 (tar.gz) を入手するか CVS から取得する必要があるよ。ソースの構成は CLISP の IMPLEMENTATION NOTE に書いてある。
>>609 ありがとうございます。(´;ω;`)
早速ダウンロードしてなんとか_clisp.cにmain関数を見つけることができたのですが
今まで教科書に載ってあるようなCのコードしか読んでこなかったので
defineやifdefがありまくりのコードはどうやって読んでいけばいいのか
検討もつきませんorz
「現実」のソースを読むためのコツやツールの使い方(今はテキストエディタでファイルを1つ
1つ見ているんですが、多分もっと楽に複数のソースを読むためのツールがあるはず・・・)
Webサイトか書籍はないでしょうか?
_clisp.c は Win32 用のドライバプログラム (clisp.exe) のソースだよ。 Implementation Notes の 33 章がソース構成の解説。CLISP のソースは ちょっと独特で .d というコメント付きのソースを comment コマンド (util/comment5.c) で .c に変換してる。 コア部分は src/eval.d がインタプリタ/バイトコードインタプリタで コンパイラは lisp で書かれた compiler.lisp が本体。CLISP はコメントや ドキュメントは結構充実してるけど日本語の情報は少ないんで、いきなりチャレンジ するのは敷居が高いかもねぇ。C や LISP はどのくらいの経験なの?
>>611 プログラムの勉強を始めて2年ほどなんですが
Cの経験はC++でテトリスもどきを作ったことがあるぐらいです
本に載ってるようなアルゴリズムは理解できるんですが、それと現実のソース読むのは
全然別問題ということを痛感してますorz
Lispは半年ほど前にPaul Grahamのエッセイを読んで興味を持ったんですが
SICPや竹内先生の本のevalの実装を見て、実際の処理系はどうやって実装されてるのか
理解したくなったので、いままで勉強のために使っていたCLispのソースを呼んでみようと思いました。
>>613 このソースなら自分にもなんとか読めそうです。ありがとうございました。
あと、話は変わるんですがオープンソースを読んでいくならUnix系のOSを
使っていくようにしたほうがいいんでしょうか?
うまく言えないんですがUnixを使っていれば自然に身に付くような知識が
暗黙の了解としてオープンソースを読むときに必要になるんじゃないのかなと
少し思ったので・・・
>>614 多少そういう面はある。金掛かる訳じゃないし、とりあえず使ってみるといいよ。
どちらを使ったほうがいい、というのではなく、どちらも知っていることが有益。
Windows用にビルドされたclispの4.1で、 ディレクトリのファイル一覧を取得して操作したいのですが、 その中に日本語名のファイルが存在した場合 syntax error... (つД`)・゚・ エンコード系の設定が不足しているのか、もともとclispで 日本語名のディレクトリ&ファイルを操作することが出来ないんでしょうか?
CLOS で、あるクラスの派生クラスであるかどうかの 判定方法はどのようにするのですか? 今は作った派生クラス皆に対して
CLOS で、あるクラスの派生クラスであるかどうかの 判定方法はどのようにするのですか? 今は作った派生クラス皆に対していちいち type-of で比較判定をしています。
>>618 typep 使えばちゃんと継承関係を遡るけど。。
何かCLOSの使い方間違ってないか?どんなクラス作ってんだ?
>>619 その typep を知りたかったんです。助かりました。
EUC は2バイト文字が \ を含まないからね。
623 :
620 :2007/02/13(火) 01:32:37
>>621 線形リストの中身に対し順に作業をするのに、
あるクラス A の派生クラスのインスタンスである場合にだけ
特別な事をする様な事をしてまして、そこでの判定時に使ってます。
おっしゃる通り、
そこでの作業について、クラス A のインスタンスか否かで
呼ばれる関数が変わる様にすれば良いのかもしれないんですが、、、
少なくともそういうのをあからさまに書くのはOOの考え方には反してるね 実際に(設計が悪くて)必要な場面があるだろうことは否定しないけど
確かに(CLOSでは)元のクラスをいじらずにメソッドを追加できるから、必要性は低いけれ ども typep くらいは常識として知っておく必要はあるね。 いろんな手法を知った上で最適な解を選ぶべきで、一概に設計が悪いとも言えないだろう。
626 :
624 :2007/02/13(火) 21:36:25
>>625 >一概に設計が悪いとも言えないだろう
確かにその通り.あれは例えばのつもりだった
Common Lispでは (let ((x 20)) (defun hoge () x))) (hoge) とやるとxの値が返るのに Schemeではエラーになるのは何故なんでしょうか?
>>628 すいません、説明不足でした。
Schemeだと
(let ((x 20))
(define (hoge)
x)))
(hoge)
とやってもエラーになるのは何故か?
ということを聞きたかったんです
>>629 Schemeのletの本体にはdefineとかじゃないものが最低ひとつは必要だから。
例えば
(let ((x 20)) (define (hoge) x) (hoge))
ならエラーにならない。
>>630 (let ((x 20))
(define (hoge)
x)
10))
こうやると10が返されるんですが、その後に
(hoge)
を呼び出すとやっぱりエラーになってしまいます。
>>631 letの中のdefineはローカルスコープで定義するから、letの外側では無効になるのよん。
Common Lispとの違いという意味では有意義だけど、Schemeの話を続けるなら他のスレ
のほうが良いかもね。
(let ((x 20)) (define (hoge) x) ) = (let ((x 20)) (letrec ((hoge (lambda () x))) ) ) だから。 詳細は r5rs の 5.2.2 を参照のこと。
>>632 defun どこで呼ばれても大域環境に関数を作る
define その呼ばれたスコープ内に関数を作る。当然そのスコープ外ではその関数は使えない
こういう違いだと考えていいんでしょうか?
でもこれだと
(let ((count 0))
(defun reset ()
(setf count 0))
(defun stamp ()
(setf count (+ count 1))))
みたいなのをSchemeでやるのは難しそうですね
>>634 Schemeで書くとこんな感じかn
(define reset '())
(define stamp '())
(let ((count 0))
(set! reset (lambda () (set! count 0)))
(set! stamp (lambda () (set! count (+ count 1)) count)))
>>635 すごく参考になりました。ありがとうございます。
バレンタインデーの真昼間なのに質問してすぐに回答してくれるなんて(´;ω;`)
>>636 どうでもいいけど、お礼なのか嫌味なのか微妙なレスだなwww
文字列や文字からシンボルを作るにはどうやれば良いのでしょうか?
intern
>>638 うひゃー文字列としてリストも読み込めるみたいですね。凄い。
ありがとうございました。
LispでのCGIに挑戦しようと思ったのですが Windows環境でCLispを起動すると WARNING: locale: no encoding CP932, using ISO-8859-1 WARNING: *TERMINAL-ENCODING*: no encoding CP932, using locale encoding という警告が出てしまいます。 これを出ないようにするにはどうしたら良いのでしょうか?
その CLISP は cp932 エンコーディングをもっていない。 libiconv がリンクされてないバイナリなんじゃないか? あと、イメージにいろいろ取り込んでくと CGI は実用に ならないだろうね。 FastCGI か mod_lisp を使う事になると思われ。
>>642 2.37を使用していたんですが、最新版を試してみたら警告が出なくなりました。
>イメージにいろいろ取り込んでいく
これはどのような意味なんでしょうか?
あと今気が付いたんですがCommonLispで環境変数にアクセスするにはどうしたら良いのでしょうか?
調べてみるとGaucheならget-envで取得できるみたいなんですが
CLtLやClispのドキュメントを見てもそれらしい関数が見当たりませんorz
>>644 そうなんですかorz
わかりました。ありがとうございます。
646 :
デフォルトの名無しさん :2007/02/17(土) 00:20:04
(while t (dolist (c '(33478 33449 33471 33474 33453 33471 33476 10)) (princ (code-char c)) (sit-for 0.03)))
647 :
642 :2007/02/17(土) 15:27:41
CLISP でも ext:getenv で取得できるよ。 glibc モジュールがあるなら linux:getenv も使える。 CLISP Implementation Notes の 31.8 を参照のこと。
その程度自分で作れないでどうする
>>648 foreign function interface のこと?
それか SWIG で探すと何かみつかるかも
>>648 それは LISP と Python とのインターフェースとは言わないような。
Python で書かれた Lisp もどきだろう。素直に Python 使うほうがいいと思う。
Ruby で書かれた Lisp もどきも沢山あるよ。でもスクリプト言語で実装された系の
もので、残念ながら遅い、不完全、作者モチベーション低いなど実用になるものはほとんどない。
C へのインターフェースというのは、 Foreign Function Interface (FFI) と呼ばれる
共有ライブラリや DLL を使う機能。処理系毎にこの機能をもっているが、フリーの実装
だと最近は CFFI という共通化された API を使うのは主流。AllegroCL なんかは SWIG
に対応して C/C++ のモジュールが使えるね。
ひょっとして (defun new-hoge (x) (labels ((getx () x))) #'(lambda (message) (if (eq message 'getx) (getx))) と定義して (setf (symbol-function 'a) (new-hoge 10)) とするとJAVAなんかでクラスを定義した後、newしたのと同じことになるんでしょうか?
まぁ、なんとなく言いたい事はわかる。 だいたいそれでオブジェクト指向でいうオブジェクトと似たようなもんだ。 実際はクラスベースの OO だとクラスとオブジェクトそのものを分離するとか 継承とかの実装とか、いろいろ細かい点あるけど(メソッドは「クラス」に 属するもので「オブジェクト」に属すとプロトタイプベースぽくなっちゃう)。
無名関数があるということは無名マクロもあるのだろうか?
>>654 無名マクロってどう使うんだろ。
macrolet があれば十分な気がする。
存在しても意味はない。マクロとは、プログラムの構造やパターンに名前を 付けたもの。たとえば、 when マクロを無名として使うと (when (condition) body ...) ↓ ((mcaro (cond &body body) `(if ,cond (progn ,@body))) (conditon) body ...) となる。嬉しくもなんともない。if や when のような構文は高階関数のように 組み合わせるってこともないからね。だが、それでも君がどうしても無名マクロを 実現したいなら、君の自作インタプリタの評価器で lambda フォーム のように macro フォームを無名マクロとして評価すれば実現はできる。
すげーわかりやすい解説ありがとう。 >マクロとは、プログラムの構造やパターンに名前を 付けたもの これが今まで読んだ本の説明より一番分かりやすかった。
* (defun test2 () (read) (format t "test> ") ) TEST2 * (defun test3 () (format t "test> ") (read) ) TEST3 * どっちも同じ挙動になるんだけど(sbcl) 同じ事にぶち当たって解決した人は いません?
バッファリングの問題だね。効率の問題で入出力は内部でバッファリングされる バッファリングモードが標準で使われる。 C とかでも同じだが、通常これは改行 されるまで内部バッファはフラッシュされないため、画面に表示されない。 なんで、Common Lisp の finish-output オペレータを使って手動でバッファ内容 を出力してやれば望みの結果が得られるよ。 (defun test () (format t "test> ") (finish-output t) (read))
>>660 速いレスありがとう。
バッファリングの問題なのか。
早速試したけど、うまくいかなかったです。
finish-output の引数が t だから。 省略するか *standard-output* を指定すれば期待どおり動く。 format の最初の引数が t の場合、出力先は *standard-output* になるが finish-output の最初の引数が t の場合、対象が *terminal-io* になる。
662 :
659 :2007/02/25(日) 12:09:22
すまん…
>>661 の言うとおり finish-output の引数が違う。
詳しく言うと、以下の通り。
format の第一引数は nil, t, ストリーム、文字列のいずれか。
nil なら結果が文字列としてかえる。t なら標準出力 *standard-output* になる。
finish-output の引数はストリームで省略時は *standard-output* ね。
じゃあ (format *terminal-io* "test> ") -> (finish-output t) でもいいのか… うーむわかりにくい
ありがとう! おかげさまでうまく動きました。
教えてもらったお礼にあれからいろいろ試した事を書きますね。
>>658 のことですが、 emacs+slime上の sbcl では何の問題もないようです。
また、openmclも問題は起きなかったです。起きるのは、terminal上で使うと
きのsbclだけおきてたようです。(openmcl sbclだけしか使ってないけど。)
その対処方法まで教えてくださって重ね重ねありがとうです。
総称関数とオーバーロードが意味的に異なってるのは、どういう点においてなんでしょうか?
総称関数の機能はオーバーロードの機能を包含するというのが私の理解 どう包含するかってのは,ANSI Common Lispでも読んで
>>668 済みません、端的に教えてもらえると助かります。
オーバーロードに無くて総称関数にある機能ってなんですか?
個人的には総称関数はoverloadよりもoverrideを想定している気がする。 overloadとして考えると引数の数の違いなど機能的に不十分とも思える。
二択で言えばオーバーロードは含んでいないというのが私の理解だったりするが(キーワード引数を除く)。
>>668 が言いたいのは第一引数以外の引数もメソッド特定に関与するということだと思う。
あえて機能的に比較してみれば、ってことで、理解していない人が理解しようと
してオーバーロードを持ち込んだ話をするのは間違いの元だから止めた方がいいよ。
>>668 総称関数はオーバーロードを含んでないっつーか種類が異なるものでしょ。
>>669 オーバーロード
関数のシグネチャ(引数とか返り値の型のことね)によって動作を変えるだけ
総称関数
よくあるOOPだとメッセージを送る対象は左に置くでしょ。
でもCLOSでは引数みたいに右側に置くことで、メッセージを送るオブジェクトが1つでも
それ以上でも一貫したルールで抽象化できる
っていう風に認識してる。
まあ複数のオブジェクトに同時にメッセージを送るのはOOP的にどうなんだろうって感じもするけどね
あとわかりやすい違いといえば
>>670 も言ってるように、どの処理をするのかが、
オーバーロードではコンパイル時に対して総称関数は実行時っていうことだね。
>>671 未知の物を理解しようとするとき、(少なくとも表面上は)似た物を比較することで理解しようとしていくのは
基本でしょ。それを禁止されたらなにもできないべ。
673 :
668 :2007/02/27(火) 05:39:20
オーケー,回答が投げやり過ぎて嘘になっててしまったみたい
これでどうよ
まとめると,「共に,単一の名前に複数の関数を関連付ける」という点では共通しているが...
>>672 が言ってるのは:
オーバーロードは静的に(オペランドを与える式の型に従って)解決される
総称関数は動的に(実際にオペランドとなったオブジェクトの型に従って)解決される
(
>>670 曰く,この点で総称関数はJavaでオーバーライドされたメソッドの解決と似ている)
>>670 が言ってるのは:
オーバーロードでは引数リストが違うものを同じ名前に関連付けてよい
総称関数では関連付けられる関数(メソッド)たちの引数リストは共通してなければならない
おまけ
CLOSの総称関数では型のみならず個々のインスタンスについても動作を変えられる(EQLスペシャライザ)
(例えば「第1引数がnumberだったら」に限らず「第1引数が 0 だったら」みたいな)
まぁこうやって羅列されたの読んでもいいプログラム書けるようにはならないわけですが...
> それを禁止されたらなにもできないべ。 んなこたーない
>>672 似たものを比較することで理解しようというなら、まず君の「オーバロード」の定義を提示しなさい。
せめて「○○言語におけるオーバロードと比較して」とか書いてくれないとお話にならない。
>>667 まだ、だれも言ってないみたいなので書いておくが、CLOS は C++/Java とは
設計思想から変える必要がある。引数の数によるオーバーロードはあんまり使わない。
個数を変更するような場合(省略可能値とか)オプショナル引数やキーワード引数を
使うとかはあるが、基本的に CLOS の総称関数はそのシステムのインターフェースだ。
そのインターフェースにオブジェクトを当てはめる事でメソッドを特定する。
俺も元々 C++ から来たんで最初戸惑ったけど、総称関数はもっと厳密なインターフェイスなんだよ。
クラスにメソッドが属するシステムだと、結局同じ名前だけどクラス毎に意味が
まったく違うって事があるけど、CLOS では名前の重みがもっと強い。
うーむ、ねむいのでうまく説明できんな。もうちょっと説明考えてみる…。
つーか、なんで「引数の数を変えられない出来損ないのオーバーロードです」って 言いきっておしまいにする勇気を持てない? 動的なことが特徴…とかならともかく、 包含するとか、定義を明確にしろとか、名前の重みとか、端で見ていてハズカシイよ。
>>678 そう言い切っても構わないけど、それで得られるものは少ない。
ここはCommon Lispのスレだし、現状の総称関数の使いこなしを考えるほうが
有意義ではないか?
別の言語を作りましょうという話なら、俺言語作成スレでも立てて勝手にやってくれ。
>>678 いくら2chでも、その話の進め方は気持ちが悪すぎるよ。
自分の思う通りの結論を相手が出してくれない苛立ちを、勇気にすり替えて相手の人格の問題にすんなって。
あと「端」ってのも痛い。そういうのは自分一人の名義で言ってよ。端の一人である俺にはお前の方がハズカシイし。
あーあ、本スレもひどいことになってるし。こっちも人間初心者がきちゃったね……。 とりあえず、粘着されて荒れるのもアレなんでしばらく放置推奨?
だろうね。ここの過去ログか本スレの方か忘れたけど同種の質問は以前にも 議論されているので本当に知りたい人は当面そっちを参照してねということで。
lisp使ってる人ってエディターはemacsなのでしょうか?
vim
xyzzy
emacs21
688 :
デフォルトの名無しさん :2007/03/06(火) 23:25:15
xemacs
meadow
構造エディタ
イメージの保存ができれば repl だけで
cよりちょっと遅い程度の処理速度が実現できるのってECLでしょうか?
>>684 CLISP, SBCL, CMUCL, SCL, ECL, ABCL では Emacs + SLIME が今や標準的地位を占めている。
AllegroCL なら ELI, LispWorks なら附属のエディタ (Zemacs ライク) という撰択もある。
あと Corman も附属のエディタが主流みたいだね。
熱烈な vi 派なら vim で SLIME プロトコルを一部実装した Lisp モードもあるが、
せっかく Lisp やるなら Emacs を覚えて損はない。Lisp の経験がほぼそのまま
Emacs にも使えるんで相乗効果ですばらしい。クロージャがないとか
仕様の違いがわかるようになればそれは貴方の学習が進んだ証拠だ。
言語マニアになると Emacs Lisp の仕様にケチをつけはじめたりするが、CL パッケージ
で我慢するか Emacs をハックするのが正しい姿。
Windows 限定で xyzzy という手もある。
Emacs系のエディタは一度は使ってみるべきだよね。 抜けられなくなるまで使い込めば、XKeymacsでWin環境での操作が極楽になるという特典も付いてくる。
Emacsenのなにがいいかって、Ctrl+でカッコを移動できること。 これを極めると、 「はて括弧なんてあったかいのう?」大変だ!おじーちゃんがLisp脳でボケちゃった! が実現できる。
696 :
デフォルトの名無しさん :2007/03/28(水) 10:46:11
lispで自動でマルチスレッド化するものってありますか??
自動でマルチスレッドってどんな感じ?もうちっと具体的な質問を頼む。 Cray 用の AllegroCL とかは並列化に強そうだが、そゆ話だろうか…
lispぐらい抽象度の高い言語ならば、評価時に処理を並列化することが 可能ではないかと思ったんです。 JavaやC++のようにthreadを意識しなくてもロジックの依存度を解析して 自動で並列化するlispの処理系なりライブラリがあるんではなかろうかと。
(func (f 12) (f2 14)) なんて関数があったとしたら、func評価時に(f 12)と(f2 14)を自動で並列化 してくれるみたいな。
700 :
デフォルトの名無しさん :2007/03/29(木) 12:18:05
701 :
デフォルトの名無しさん :2007/03/29(木) 15:12:58
364 名前: 名無しさん@1周年 投稿日: 2001/01/03(水) 06:46
gotoの欠点って何だっけ?
365 名前: 名無しさん@1周年 投稿日: 2001/01/03(水) 06:58
>>364 後藤さんへの差別
>>700 サンクス〜
haskellとかならパラレルになるのかな。
lispでもスコープ外の変数に参照を持たない関数のみを並列対称にすれば
出来そうな気もするけど・・・abcl改造してしてみよっかな・・・
Connection Machine の *Lisp みたいにプログラマが明示するタイプの 並列化じゃだめなんか?
lispってソケットも使えないんだろ?
そういう意味では「Cもソケットは使えない」よねw
OpenMPのようにシングル・マルチコアの両環境でソースを使いまわせるように したい。これからはメニーコアの時代らしいのでそうならんかな〜と。
デバッグ用のプリント文を if の then の位置等に入れるときにはどうしてますか? プリント文が不必要なときには (if ... (then の内容 とシンプルに書けますが,必要になると (if ... (progn (format ... (then の内容 どうしても progn を入れる必要があるかと思います。 デバッグを終えたときにただプリント文をコメント化するだけなのか, また progn をはずして綺麗にするのかいつも悩みます。
気に病むくらいなら常に cond を使おう。cond は伝統的な良い構文だ。 あと、else部が要らないときは when、then部が要らないときは unless を使うのも手だね。
cond っすか? なるほど〜。 たしかにその行を削るだけで済むか。 なんとなく Bourn Shell みたいだ。w さんきゅです。
デバッグ出力は基本的に消さずに #+nil とかでコメントアウトしておくだけだなあ。 今必要ってことは将来また必要になるかもしれないし。 あと、デバッグ出力に頼ったということはコードだけではわかりづらかったという ことなので、その旨コメントを書いておくことが多い。
すみません。#+nil っていうのはなんでしょうか? google 先生が教えてくれません。。
(progn無しに)ifとかで使うと見つけにくいバグを起こしそうで不安だよね。 トップレベルとか、それに近い見晴らしの良い場所では使うけど。
>>714 これは好きになれないなぁ。ここまでシンボルで駆動するのってどうよ、っつーか。
:then :else みたいにせめてキーワードシンボルだったらまだ許せるかもしれんが。
同じ理由でCLtL2のLOOPマクロも好きになれない。
>>715 しかし構造のみであらわすより名前で明示するほうがいい場合もあるしなー
とか loop も Edi Weitz 氏が多用してるのを見て許せるようになった俺がいってみる。
717 :
711 :2007/04/03(火) 08:25:23
う〜ん。。なるほど。#+test って言うのが有ったんですね〜。 基本的にはこれは実装依存コードを書くのに使うんだけど、 C の #DEBUG とかみたいなテクニックにも使えると。
718 :
デフォルトの名無しさん :2007/04/04(水) 02:50:39
on lisp p56のour-mapcanで質問です。 (apply #'mapcar fn lsts)の部分が何をやっているのかわかりません。 (mapcar fn lsts)と同じかと思って、 (apply #'mapcar #'sqrt '(1 2 3))とやってみたのですがエラーになります。
719 :
718 :2007/04/04(水) 02:52:32
質問直後にわかりました。失礼しました。 (apply #'mapcar #'sqrt '((1 2 3)))
On Lisp翻訳者です. このスレも(専ブラでw)チェックしてますんで何かありましたらどうぞ. だからと言って毎日即座に有益なお返事ができるとは限りませんが...
Practical Common Lispの日本語訳マダー?
『たのしいCommon Lisp』が出るのはいつですか?
なにこれ? (= 1 1) => #t どうみても Scheme です。本当にありがとうございます。
スキームだって広い意味ではリスプですよ。コモンリスプじゃないけど。
728 :
デフォルトの名無しさん :2007/04/09(月) 21:56:13
Practical Common Lispの日本語訳マダー?
誰かやってんの?隠し立てするなよ。w
リリカルLisp欲しかったなあ・・・
let は macro を使うと lambda と変数の束縛の形に書き直せますが、 multiple-value-bind と values の組は書き直せますか? S 式の構文解析をするような事をしてるのですが、 多値が出てくると手に負えません。 また、そういうのは何を見ると分かるのでしょうか?
別の質問です。 eval に、コンパイラ自身のデバッグオプションみたいな、 式を評価してその途中を表示するような機構はないですよね〜? dissassemble の手前みたいな。。 gcc の RTL は S 式に対応してますが、 RTL 生成後のコンパイラの backend 部分を フォロー出来るようなオプションです。そういうのは実装依存ですか?
>>730 知人にドン引きされた。Scheme と名乗っていて欲しかったよ…
>>731 > S 式の構文解析をするような事をしてるのですが、
> 多値が出てくると手に負えません。
これだけじゃ何をやろうとして、何がどう手に負えないのかわからん。
多値は最小 20 個程度なんだから評価器に組み込んでおくべきじゃないかなー。
>>732 まず eval にはコンパイラは使われない。大抵インタプリタで動作する。
コンパイラの挙動がどこまで見えるかは実装依存。たとえば ACL には :explain で
コンパイラがどんな型を推論したかや、変数の boxing、クロージャの割り当
てなどがコンパイル時に表示される機能がある。
関東(秋葉の店とか)で売ってるならネタで買ってもいいけどなぁ。。 なんとかフェスティバルに行く勇気はなかったわw
>>737 多値なしの評価器で lambda のみで書き直すのは難しいんじゃないかな。
multiple-value-call はスペシャルオペレータだし、values -> list, multiple-value-call -> apply
の変換はやっぱり一般化できない。
(lambda () (if (= (random 2) 1 (values 2 3))))
多値を返すことは継続を複数の引数で呼び出すことだから、CPS に変換すれば lambda だけで書き直せるよ。 Common Lisp では末尾呼び出しの最適化が保証されないし、できるというだけで あまり意味がないと思うけど。
Scheme信者が迷い込んできたなw
741 :
731 :2007/04/11(水) 18:39:24
皆様,有難うございます。難しそうだ,ということが分かりました。w 今回は lambda にこだわらずになんとかベタに評価器部分に書き込む事にしました。 別に Common Lisp にこだわってるわけじゃないんですけど, 資産の問題が。。それから,継続の仕組みを使うところだけ 外部 Scheme を呼べたら面白いかも。って思いました。 もちろん,FFI を使えばいいんでしょうけど,なんとなくスマートでないような。。 宗教戦争はおいておいて, あんまり Common Lisp から Scheme を呼ぶような,もしくは逆の プログラムを書く人はいなさそうですね。w
full continuationを実装するとevaluatorの造りが大きく影響される。(いろいろ制約が増える) そういうわけで結構実装が難しいので誰も作らないのかも。
>>741 CL で実装された Scheme を使えば継続つかえるよ。
でも俺は混在させようとは思わないけどな・・・。
継続はあらゆる問題を解決する魔法じゃないしね。
継続よりも効率的な Python みたいな yield や、Erlang みたいな
軽量プロセスが欲しい。そうゆうインターフェースを実装したライブラリ
では満足できない。処理系組み込みのがほしい〜。
>>743 その願望、お前はオレか
Pythonのyieldとcall/ccの効率に差があるかどうかは実装によるのでは。
745 :
743 :2007/04/12(木) 22:46:13
む?yield はあんまり検討してないからそうなのかも。 Erlang のプロセスは皆が憧れてるだろ?海外でも Lisper は皆大抵 Erlang スキーだし。よく論争になってるし。俺が Erlang を知ったのは 何年か前の ポーカーサーバを Lisp で書くよ → Erlang のほうが楽だった…これイイわ みたいな記事だったし。 cl-muproc でガワだけは真似できても、やぱっり組み込みじゃないと 性能がでない。というかスレッドと Erlang プロセスが 1:1 では重すぎる。 やっぱり実装レベルで軽量プロセスをサポートしてくれないと、でも Lisp だと 副作用があぅあぅあぅ。 Franz か LispWorks かどっちかが実装してくれんかなぁ。
747 :
743 :2007/04/13(金) 23:18:27
>>746 それそれ。つうか素直に Erlang をつかってるとも。だけど、CL + 並列プログラミングが
個人的には理想に近いかなーと思うわけ。いや、Erlang の機能に不満があるわけじゃないんだが…。
なんつうか、関数とマクロとか好きなレベルで抽象化できるのに慣れていると、もうちょっと
好き勝手したいなーとか思うんだよ。メッセージによるプロセス間通信は「正しい事」のような予感する。
>>728 今、気合いだけで訳してる(240ページまでいった)けど
英語が苦手せいか(英検5級w)なかなか進まない・・・
そもそもきちんと理解できてるかどうかも疑問だけど
全部訳せたらPeterさんにメール送って公開してもいいかどうか聞くつもり。
> 全部訳せたらPeterさんにメール送って公開してもいいかどうか聞くつもり。 全部訳してから許可もらうのかよ! 逆だろ! 他にも作業してる奴がいるかもしれないとは おもわなかったんかい。同時多発車輪の再発明は Lisper の常だなぁ…。
751 :
748 :2007/04/14(土) 12:29:53
>>749 うわーん、嬉しいのか、悲しいのかよくわからない気分になってます(;つД`)
>>750 ・途中で挫折する可能性大
・きちんと訳せる自信がなかった
だったのできちんと完成させてからにしようと思ってました。
・空気読まずにマイペースで訳を続ける
・PAIPかSmall Piecesの訳にチャレンジしてみる
上の選択肢ならどっちがお薦めですかね?
PCL も PAIP も Small Pieces も出版物なんだから出版社に権利があるだろう。 個人で権利関係がなんとかできるとはおもないし。だから「やってるよー」とどっか宣言はしとけよ。 コソーリやってたら誰もコンタクトとれないじゃん。PAIP 欲しいな。
>>748 よく理解していないものが訳したものというのは、混乱させられる原因になる.
PCLは精力的にやっておられる方が訳をしているようだから、公開されたら良い
見本になると思うよ。自身で訳したものとの違いをしっかり検討して実力に蓄
えると考えればいい。748さんなら、現在のど根性訳は人生の中の練習問題だと
おもえばいい。
すみません、commonlispの入門書とか読みながらemacsの中でrun-lispして遊んでる程度の人です。 関数の振る舞いでワケがわからなくなったので教えてホシイ事があります。 emacs-lispで (functionp '+) とするとtが返りますがCLISP上で同じ事をするとNILが返ります 同じように判定するにはどうするのだろうとCLISPのfunctionpの項目を眺めていたのですが (functionp #'+) であればTを返す事を知りました。 このfuncitonpの振る舞いの違いというか、変数に束縛してある関数が関数であると知る簡単な方法がわかりません。(#'が何をする物かもわからんのです,ググレナイ)
>>754 CommonLispの変数は値と関数を同時に持つことができるのだよ。
ふたつのセルを持っていると思えばよい。
#'は変数から関数の方を取り出す操作
elisp との違いは単に仕様が違うってことなんじゃないの common lisp の functionp は引数が関数であるかどうかを判定する。 elisp の functionp は引数が関数または関数定義を持つシンボルであるかどうかを判定する。
>>754 「シンボル」それ自体は「関数」ではないということ
シンボルから「関数」を取り出すのが #' の役目
>>754 変数というか Common Lisp ではシンボルに値セルと関数セルという別々のスロットがある。
それぞれ関数で取り出せる。値セルは (symbol-value 'symbol) で参照できるし、関数セルは
(symbol-function '+) で参照できる。
(functionp '+) == (functionp (symbol-value '+))
(functionp #'+) == (functionp (symbol-function '+))
「変数に束縛」という理解から「値スロットへの束縛」と「関数スロットへの束縛」という二種類を
まず意識するといい。効率が悪そうに見えるかもしれないが、ローカルな束縛ならコンパイラはシンボル
を作成せずに効率よく扱ってくれるんで実際は効率問題にはならない。
> (functionp '+) == (functionp (symbol-value '+)) これは違うだろ
> (functionp #'+) == (functionp (symbol-function '+)) '+ ならいいけど、誤解を招かないとも限らないので一応 * (flet ((f ())) (functionp #'f)) T * (flet ((f ())) (funcitonp (symbol-function 'f))) Error in KERNEL:%COERCE-TO-FUNCTION: the function F is undefined. [Condition of type UNDEFINED-FUNCTION]
761 :
758 :2007/04/16(月) 00:45:56
ギャー。間違えた。試さずに書込むとダメだな…。
指摘サンクス。でも初心者には説明不足じゃね?
>>759 >>760 俺が責任をもって説明しよう。
1. 「シンボル」に値スロットと関数スロットがある (という理解でいい)
2. functionp はパラメータそのものを評価する (これが
>>759 の指摘)
(functionp '+) => NIL : (type-of 'x) => SYMBOL
(functionp #'+) => T : (type-of #'+) => COMPILED-FUNCTION
3. シンボル + は COMMON-LISP では特殊な意味を持つ (なのせ + や * というシンボルを解説につかうのはいくない)
*、 **、 *** : それぞれ直前の評価の値、ニコ前の値、三コ前の値
+、 ++、 +++ : REPL で評価した直前のフォーム、ニコ前のフォーム、三コ前のフォーム
4. flet, labels はローカル関数を定義するが、それはシンボルへの束縛を作るわけじゃない。
(これが
>>760 の指摘)
5. #' (function オペレータ) は関数定義をレキシカル環境から探索する。見つからなかったらグローバルな関数定義をさがす。
で、例は↓みたいな事がいいたかんたよぅ。
CL-USER> (defvar x nil)
X
CL-USER> (type-of (symbol-value 'x))
NULL
CL-USER> (functionp (symbol-value 'x))
NIL
CL-USER> (setf x #'+)
#<SYSTEM-FUNCTION +>
CL-USER> (type-of (symbol-value 'x))
COMPILED-FUNCTION
CL-USER> (functionp (symbol-value 'x))
T
762 :
748 :2007/04/16(月) 01:52:40
>>753 そうですね、例外のところなんか読んでて意味がよくつかめてなかったり
してましたから・・・
でも途中まででも訳したのは良い経験になったと思います。
754です。 何かCommonLispとelispの差異(というかオールドファッションなlisp全部?)で一番こんがらがりそうな部分ひいちゃったんでしょうか? 最初の書き込みの時に何をしでかして躓いたのか書かなかった僕が悪いのですが。 '( 1 2 3 4 5 + / * - +) こういうリストを食わせてRPN電卓もどきな処理をする際に食ったリストの中で関数に割り当てられたシンボルだったらそれをfuncallしようとしていたのです。 そこでfunctionpが何食わせてもNILを返してきてパニックに陥ってこのスレに駆け込み寺しました。(#'がgoogleで検索できない文字列だと言うのもびっくりでしたが) CommonLispのシンボルには値と関数の2つの割り当てスロットがある事までは理解しましたが この場合 (setq plus '+) (functionp plus) -> NIL (functionp #'plus) -> ERROR ←なんとなく関数スロットに何もないからだと言うのはわかる (funcall plus 1 2) -> 3 なぜにfunctionpがnilなのにfuncall可能なのかがさらにわからないのです。
>>763 > (setq plus '+)
この時点で、plusというシンボルの「値」スロットに + というシンボルが入る。
> (functionp plus) -> NIL
シンボルというものは「関数」ではないので当然NIL
> (funcall plus 1 2) -> 3
plusの「値」は + なので、これは
(funcall '+ 1 2)
と同じ。
実は funcall は第1引数にシンボルが来ると、そのシンボルのグローバル関数スロットの値を
自動的に取り出すという(ややおせっかいな)機能があるので、これは動作する。
シンボルが関数として定義されているかどうか調べるのは fboundp を使うのが良いだろう。
で、真だったらそのシンボルを funcall へ渡すことができる。
仮面ラムダー ストロンガー
意味不明〜〜! ww
>>763 754 で入門書読みながらっていってたけど、何読んでるの?
> なぜにfunctionpがnilなのにfuncall可能なのかがさらにわからないのです。
functionp は引数のオブジェクトを評価しない(スロットの参照にいかない)ので、
(functionp '+) は「シンボル + は関数か?」という意味になる。当然 NIL。
(functionp #'+) は「関数 + は関数か?」という意味なので T
funcall は第一引数に「関数修飾子 (function designator)」をとる。これは関数もしくは
グローバル環境で関数名を表わすシンボルね。後者なんで functionp が NIL でもシンボル +
を funcall できるわけ。今は + を上書きしたりはしてないだろうから、#'+ == (symbol-function '+) ね。
>>754 > (#'が何をする物かもわからんのです,ググレナイ)
遅レスだけど、
'bar が (quote bar) であるのと同様に
#'foo は (funtion foo) と同じこと。
' も #' もよく使うから省略形が用意されてると思えばいいよ。
すみません clispからsbclへと移ったのですが clispだと引数に対象ファイルを指定してやればそのままそのファイルの プログラムが実行されてました。 sbclだとそのまま引数に指定しても何も起こらないのですが sbcl --loadとするとどうやらそれ以降に指定したファイルを実行できるようです ところがSBCL is free...というバナーメッセージまで表示されてしまい、これを消したいのですが (clispだとファイルを指定すればバナーが消えて結果だけが表示されてました) これはどうすればいいのでしょうか? どなたか教えてください
すんません マニュアルに書いてありました 吊ってきます...
すみませんもう一つ質問させてください sbclでsb-bsd-socketsパッケージを使って (defun test-send (server port msg) (let ((mysock (make-instance 'sb-bsd-sockets:inet-socket type :datagram :protocol :udp))) (sb-bsd-sockets:socket-send mysock msg 10 :address (list server port)))) (test-send "127.0.0.1" 2344 "hello world") こういうコードを書いて、C言語で書いたUDPクライアントと通信させようとしましたが どうも The length requested (9) does not match the type restriction in (SIMPLE-ARRAY (UNSIGNED-BYTE 8) (4)). と出てしまってどうしてもコードが通りません どこが間違ってるのかさっぱりわからないのですが どなたか教えてくれると幸いです
(sb-bsd-sockets:make-inet-address "127.0.0.1") #(127 0 0 1)
>>774 すみません、もうちょっと詳しく教えていただけませんか?
754です。
>>764 fboundpを用いてシンボルに関数割り当てがされているかの判断はできるようになりました。ただこの関数に関数でなく生の数値がバインドされたシンボルを食わせるとエラーになる理由は理解していません。
<<<(and (symbolp someting) (fboundp someting))とする事で回避はできました>>>
初学者にとって非常に興味深いのは
(setq something 1)
(fboundp something) ->エラー
(setq something '+)
(fboundp something) ->t
になることです、僕の様な初心者はsomethingに数値がバインドされているのであればfboundpはnilを返すべきではないかと思うわけです。
このあたりの解説がわかりやすく書いてある書籍などあれば助かるのですがどなたか参考文献などを紹介してくれませんでしょうか。
>>769 毎日コミュニケーションズの入門common lispを使っています。(というかelispの方はずいぶん昔に購入したelispマニュアルのドラフト版で学びました)
そのようなわけで違いのわかる書籍があるといいのですが、あいにくそういう物は無くてorz
スレで親切な返事を書き込んでくれた皆様にここで纏めてお礼を申し上げます(すっごい勉強になったです)
稚拙なコードですがclisp上でrpn電卓で遊んだ結果をここに書き込んでおきます。(何でトラブったかすぐにわかってもらえると思います)
(defun rpn (args)
(let ((stack (list)))
(mapcar (lambda (arg)
(cond ((and (symbolp arg) (fboundp arg)) (push (funcall arg (pop stack) (pop stack)) stack))
(t (push (eval arg) stack)))) args)
(print (pop stack))))
次はもっと困った時だけ質問するように努力します(できたらこれ買って読め馬鹿って本ありましたら紹介お願いします)
>>777 > ただこの関数に関数でなく生の数値がバインドされたシンボルを食わせるとエラーになる理由は理解していません。
> <<<(and (symbolp someting) (fboundp someting))とする事で回避はできました>>>
それは fboundp に「シンボル」ではなく、生の「数値」を食わせたから。
fboundp は普通の関数なので、引数は評価される。だから
> (setq something 1)
> (fboundp something) ->エラー
では something が変数として評価されて (fboundp 1) や (fboundp '1) と同じことになる。
(数値は評価するとそれ自身になる)
関数を呼び出す場合、その引数は事前に評価されるわけだが、マクロだとか特殊形式(quoteやfunctionなど)
の場合は暗黙には評価されない。(マクロの場合、結果的に評価される場合はある)
(setq x 10) とやって (let ((x 20)) (symbol-value 'x)) とすると10が返されるんですが、この場合、xと20はどのようにして結びつけられて いるんでしょうか?
>>779 symbol-value cannot access the value of a lexical variable.
ということなので、つまり、let内の変数xにはアクセス出来ない。
ダイナミックスコープ(ここでは外部変数x)になる。
let内外の2つの変数xは見た目は一緒だが、内部では別という事も付け加えておくね。
>>780 symbol-functionも同じだとすると
グローバル変数の関数を入れる場所にはdefunなり(setf (symbol-function 'x) #'(lambda ~)
などでアクセスできても、レキシカル変数では関数を入れる場所にはアクセスすることができないという
ことになるんでしょうか?
>>781 レキシカルに関数を束縛できるのは labels と flet だけじゃないかな。
setf ではアクセスできないと思う。
(言ってる意味を取り違えてるかな?)
>>784 えっとレキシカル変数の「値を入れる場所」に値を入れるには
(let ((x10))
で、
「値を入れる場所」に関数を入れるには
(let ((x #'(lambda
を使ってできるけど
レキシカル変数の「関数を入れる場所」に関数を入れることは
symbol-functionではレキシカル変数の「関数を入れる場所」にアクセス
できないから、レキシカル変数の「関数を入れる場所」に関数を入れることが
できないのかどうなのかを確かめたかったんです。(ああややこしい・・・)
>>777 ふーむ。入門 Common Lisp は読んだことないのだよなー。ポールグレアムの ANSI Common Lisp と培風館の Lisp I, II も
読むと良いよ。後者は日本語訳がいけてないのと誤植が気になるが内容は良い。Practical Common Lisp も翻訳進行中とのことでめでたいね。
Emacs Lisp の経験があるといってたがスタイルがらしくないな? CL にも dolist があるから、 CL 風味ならこんなかんじかねぇ。
(defun rpn (args &aux stack)
(dolist (arg args)
(cond ((and (symbolp arg) (fboundp arg))
(push (funcall arg (pop stack) (pop stack)) stack))
(t
(push (eval arg) stack))))
(print (pop stack)))
>>785 その言い方を借りると、レキシカルの「関数を入れる場所」に関数を入れるのが flet と labels だ。
(let と let* に相当する)
Erlang使いはまだこのスレにいる? 仕事でErlangを使っているのかどうか気になる。 差し支えのない範囲でこのスレかErlangスレで語ってほしい。
何回来たってスレ違いだよ
typedef struct _pkt_header { unsigned char op_code; unsigned long payload_len; } pkt_header; ある特定のデータブロックから こういうpkt_headerにデータを入力する pkt_header header = (pkt_header*)ptr 見たいな処理ってどうやってLispで実現すればいいのですか? またpkt_headerのような構造体をどうやってLispで定義すればいいのですか? Lispには型がないのでどうやっていいかさっぱりわかりません どなたか教えてください。
(defstruct pkt-header ...) (setf header (make-pkt-header ...))
>>761 unsigned char op_code;
unsigned long payload_len;
の部分はどうすればいいのでしょうか?
当方IA-32で開発しておりますので
unsigned charは8ビット(1 byte)
unsigned longは32ビット(4byte)
という風に型を固定にしたいです
ネットワークから流れてくるデータのヘッダ処理をしたいのですが。
キャストしてるとこから見ると、バイトデータをデコードする方法を知りたいようにも見えるな。 どちらにしても質問の趣旨がちょっと曖昧。
>>793 言葉が足らず申し訳ありません。
それです、バイトコードをデコードしたいのですが
どうすればよいのでしょうか?
(unsigned-byte 8) とかするだけだろ。 対象言語を全く知らずに開発できるわけないんだから、せめて言語仕様くらい ちゃんと目を通しとけよ。
796 :
デフォルトの名無しさん :2007/04/21(土) 22:53:56
各処理系のFFIのあたり見ろで終りじゃないかな。 #そういう所に終始するならCが一番楽だと思う。
(defstruct pkt-header (op-code 0 :type (unsigned-byte 8)) (payload-len 0 :type (unsigned-byte 32))) でおk
>>786 さんありがとう
教えていただいた培風館の方は見つかりませんでしたがANSI CommonLispの方は入手できました。
elispのスタイルらしくないのは本当にエディタのマクロとしてしか使ってないのでLispらしいことは何もしてきていないからです。
文脈で解釈異なる置換とかを正規表現ひねり出すより楽に制御したいとか、人様の設定ファイルを自分用にとかその程度なものですから。
>>794 read-byte を駆使して抽象化層を組み立ていくのが基本かな。
どのくらい抽象化できるかは、自分の技量次第。たとえば Practical Common Lisp を読めば
http://www.gigamonkeys.com/book/practical-parsing-binary-files.html ↓のような感じ。個人的には C よりバイナリの扱いは楽だなー。性能は C のほうが上だけど。
(define-binary-class packet-header ()
((op-code u1)
(payloead-length long)))
あとはバイナリをバッファから解析してけば C の構造体のように使えるよ。
>>798 あぁ、map とか使ってるから Scheme かじった事あるのかと思ったんだよね。まー気楽にどうぞ。
CL の世界は副作用避けろとか、do 使うなとか末尾再帰しろとか言われないよ。最初は慣れた
スタイルでよちよち歩いてきゃいいのさ。心掛けさえ間違えなきゃ、スタイルなんざいつでも訂正きくからね。
ちょっと興味があるんですが、日本語の文字コードでShift_JIS、EUC-JP、UTF-8、 ISO-2022-JP、UTF-16の相互変換と入出力に対応してて、日本語で正規表現の 検索ができて、httpとftpとsmtpとpop3のライブラリがついてて、WindowsとLinuxで 動作する無料でオープンソースな処理系はありませんでしょうか。。。
ネタ臭い質問だねぇ。そーゆうスクリプト言語ぽい希望なら Python か Ruby でいいんじゃない? Common Lisp なら… ABCL かねぇ。っても、希望の ライブラリは全部 Java のライブラリにお任せなので文句は Sun にいってくれ。 まぁ「ありません」ってことだね。Scheme でいいなら Gauche とか。
>>800 基本はCLISPであとは適当なライブラリを探せば済むんじゃないかな
> Common Lisp なら… ABCL かねぇ。 ワロタ
すみません sbclの The variable |0X10| is unbound というエラーはどういうエラーのときに出るものなのでしょうか?
>>806 > The variable |0X10| is unbound
> というエラーはどういうエラーのときに出るものなのでしょうか?
sbclは知らないけど、CommonLispでは||で囲まれたものは
シンボルと解釈されます。
たとえば、
(setq |1234| 5678)
|1234| ;; => 5678 が返ってくる。
ってな感じ。
なので、上記のエラーはシンボル|0X10|は値を持たない、
って意味だろうね。
>>806 もしかして16進の数値のつもりで0X10とか書いて無いだろうな?
今 lisp のパーサを作ろうと思っているのですが、
そのへんの文法の仕様書ってネットで見れないのでしょうか?
>>809 のところがやっぱり良いのかしら
complexが使えるのはありがたいのですが、3次以上の時限を持つベクトルデータをlisp上で 演算子を使った関数表記をするにはどうしたらよいのでしょうか?
韓国の方ですか?
http://cybertiggyr.com/gene/lisp-cgi/cgi.lisp ここにあるCGIパッケージをSBCLで使おうとして
(load (make-pathname :directory '(:relative)
:name "cgi"
:type "lisp"
:version :newest))
とすると
The name "CYBERTIGGYR-CGI" does not designate any package.
と出ます。
これはどのように解決したらよいのでしょうか?
http://cybertiggyr.com/gene/lisp-cgi/cgi.lisp がCLISP用なのでこれをSBCLでも使えるように
(defpackage "cybertiggyr-cgi"
(:nicknames "cgi"))
(in-package cybertiggyr-cgi)
(defun getenv (x)
"Returns the value associated with an environment variable.
Implementation depends on the underlying Lisp system."
(sb-ext::posix-getenv x))
最初の部分をこのように書き換えました。
どなたか教えてください。
パッケージ名は文字列で指定するなら大文字で
http://cybertiggyr.com/gene/lisp-cgi/cgi.lispを (defpackage cybertiggyr-cgi
(:nicknames cgi))
(in-package cybertiggyr-cgi)
(defun getenv (x)
"Returns the value associated with an environment variable.
Implementation depends on the underlying Lisp system."
(sb-ext::posix-getenv x))
に書き換えました。
すると
; in: DEFUN GETENV
; (CYBERTIGGYR-CGI::DEFUN CYBERTIGGYR-CGI::GETENV (CYBERTIGGYR-CGI::X)
; "Returns the value associated with an environment variable.
; Implementation depends on the underlying Lisp system."
; (POSIX-GETENV CYBERTIGGYR-CGI::X))
;
; caught COMMON-LISP:STYLE-WARNING:
; undefined function: DEFUN
;
; caught COMMON-LISP:WARNING:
; undefined variable: GETENV
; (POSIX-GETENV CYBERTIGGYR-CGI::X)
と出てしまうのですが...これはどうなってるんでしょうか?さっぱりわからないです...
; undefined function: DEFUN で何か気がつかないかね? ヒント:defpackageの:useオプション
>>811 CLtL2 より HyperSpec のほうがいくね?
>>812 (vector 1 2 3) => #(1 2 3) とかそゆ話?
>>818 SBCL は CGI には向かないよ。Java や Ruby on Rails が CGI に向かないのと同じで、
フットプリントがでかいから。CL-HTTP とか mod_lisp とか hunchentoot とか。今だと
hunchentoot かな。
>>819 >
>>811 CLtL2 より HyperSpec のほうがいくね?
どうだろ…
まあ、811が「仕様書」って言ってたから、仕様書ならCLtL2のほうだろうと…その程度。
この場合,消費メモリの量
CLISP とか OpenMCL が 2MB くらいで動く所、SBCL はデフォで 20MB くらい お取りになられるからなあ。起動時にヒープサイズを指定出来るようになると良いんだけど、 今の実装じゃ無理だよね。
なるほど しかしsbclのほうがいろいろライブラリ周りとかそろってて便利なのでは? 今はメモリも安くなったし、大丈夫かなーなんて...
メモリ消費量が絶対的に大きすぎるというより、そんな大きなプロセスを毎回生み殺すのが気分悪い ってことだね。CGI以外の手法について学ぶと良いだろう。
826 :
812 :2007/04/29(日) 19:05:34
>>819 (+ (vector 1 2 3) (vector 3 4 5)) -> #(4 6 8)
こういう事したいのですが、常にvec+とか自分で定義しないといけないんでしょうか?
次数も様々なものを使ってみたいのですが。
複素数は (+ #C(1 2) #C(3 4) ) -> #C(4 6)
の様に通るのですが、任意次数のベクトル演算は何故できないのでしょう?
自分のパッケージで + を再定義すればいいじゃん
829 :
819 :2007/04/30(月) 00:32:01
Common Lisp の「数」の体形にベクタは入ってないから。複素数とベクトル演算は違いが大きすぎるからだろ。 ↓こんな意見は何故だめなんだ?いちいち 集合っぽくしたいよ!! (+ (vector 1 2 3) (vector 3 4 5)) => #(1 2 3 3 4 5) 数値の演算はこう!! (* 2 (vector 3 4 5)) => #(6 8 10) そんなのおかしいだろ…常識で考えて…とか思うかもしれないが、いろんな場合があるからねー。 皆好き勝手いいはじめたら収集つかんし。828 の言うように、やりたきゃ自分でつくれという事。対した手間ではない。 (defpackage :oreore-matrix (:use #:cl) (:shadow #:+)) (in-package :oreore-matrix) (defun + (&rest vectors) ...)
(defun + (&rest numbers-or-vectors) (etypecase (car numbers-or-vectors) (vector (let ((result (copy-seq (car numbers-or-vectors)))) (dolist (x (cdr numbers-or-vectors) result) (map-into result #'+ result x)))) (number (apply #'common-lisp:+ numbers-or-vectors)))) (+ #(1 2 3) #(4 5 6)) => #(5 7 9) (+ #(#(1 2) #(3 4)) #(#(5 6) #(7 8))) => #(#(6 8) #(10 12))
829-830 ありがとうございます。 まさにそれを欲していました。 でもどこかにMathパッケージありそうな気もするのに何故に見つからないんだろう orz こつこつ作って整備して精進します。
lisperならば、maximaをやればいい。統計はもちろんRの方が御勧め。 昔のものならxlispstatという手もある。xlispstatをclへ再実装プロ ジェクトでもないんだろうかね。
835 :
デフォルトの名無しさん :2007/05/09(水) 18:04:18
最近どうですか?
ぼちぼちでんなー
ここすごい過疎ってるけど 質問があれば比較的高速に返答がくれますよね おそらく偉大なLisperがROMってくれているんですね ありがたいことです
>>837 ごめん、黙ってたけど……
質問にはおれがLispで書いたAIが回答してるんだ
840 :
デフォルトの名無しさん :2007/05/10(木) 23:55:43
アベコベガエル
Common Lisp の function-lambda-expression に対応する Scheme の関数はなんですか?
Schemeでは原理的にそういう操作は禁止なんじゃないかな。 処理系依存ならできるものもあるだろうけど。
>>842 え〜!!! そうなんですか。
define にて関数 f を定義することで、
f の値を求める事と f の関数定義を構文解析することとを
同時に行いたかったのですが。
quote を使って関数定義部を書いて eval を使って値を評価するのは、
なんとなくイケて無い様に思えるのですが普通はそうするのですか?
(スレ違いスマソ)
>>843 そういう場合にはマクロで隠蔽してしまえばよろし。
関数は定義された時点でVM用のコード、あるいは機械語に落とし込まれたりする場合が多いので、
レアケースのために全体をS式で覚えておくのはムダだからだ。
>>843 なんでそんな事したいんだ?何か目的があるんだよな?
手段よりも目的をさきに語ってくれたほうがネタがでやすいと思われ。
(defun (setf foo) ...) の意味が調べても今一分からない。 良ければ教えてくれませんか? (例えば、ANSI Common lisp p 114の (defun (setf bref) ...))
On Lisp 汎変数
λ... 本スレはやっぱり。。
>>848 さんくす。defunで汎変数が定義出来るのですね。
clispでlispの勉強をしています。 マクロの中のマクロもmacroexpandするにはどうしたらいいでしょうか? たとえば、以下の例だと progn の中の incf も展開した形で見たいのですが・・ [1]> (macroexpand '(progn (incf aaa))) (PROGN (INCF AAA)) ; NIL
>>851 SBCL だけどこんなかんじ。でも、素直に (macroexpand '(incf aaa)) とかしないと
人間の脳味噌だとあっというまに対応取れなくなっちゃうよ。SLIME の操作を覚えて
S 式撰択 → Macroexpand の手順を覚えるのが吉。
CL-USER> (defun macroexpand! (expr)
(if (atom expr)
expr
(macroexpand
(cons (macroexpand! (car expr))
(macroexpand! (cdr expr))))))
MACROEXPAND!
CL-USER> (macroexpand! '(progn (incf aaa)))
(PROGN
(LET* ((#:G3015 1) (#:G3014 (+ AAA #:G3015)))
(SETQ AAA #:G3014)))
NIL
>>852 ありがとうございます。
macroexpandが展開するのはリストの car部分がマクロの場合だけ。
今回のケースだと展開したいと思ってた incf は cdr にあるから展開はしてくれない。
cdrの中のマクロも展開したいなら自分で書くしかない。
ってことですね。
とりあえず、SLIMEとかを覚えようと思います。
856 :
855 :2007/05/18(金) 00:59:25
h 抜き忘れて直リンしちゃった… orz
いまどき抜く必要(意味)なんてないよ
今、ウェブ・サービスの多くが、 Javaや.NETベースのアプリケーションサーバや、 Perl/Ruby/PHP/Python等のLightweight Languageの上に構築されていますが、 なぜそこにLispが含まれていないのでしょうか?
一本釣りじゃなくて二本釣りだったみたいだな
恥ずかしい質問なんですが、 (setf y '(setf x 1)) でyに代入された(setf x 1) ってデータですよね? これって文字列なのでしょうか?
文字列ではありません
ではなんと言うデータ型に属するのでしょうか?
「リスト」というデータ型に属します
んじゃ、フォームではないリストなんですね。 setfはただのデータであり要素なんですね。
はい。setf は単なるシンボルです。
初めての人のためのLispという古い本をもらったのですが、 中に著者で竹内郁雄という人のサインが書いてありました。 竹内郁雄って言う人はどのくらいの有名人なのでしょうか? 持ってた方がよいですか?
有名度は井田昌之と同じくらいなので、持ってたほうがよいです
>>866 最近たらいまわし関数が流行ったけどあれを考えた人
ブックオフへたらい回ししちゃ駄目だぞ
ちょっと前に似たような質問があるけど
ttp://blog.livedoor.jp/dankogai/archives/50838479.html > 条件式の結果を左辺に書ける言語って、C/C++以外にあるのだろうか。
これをやってみようとして
(let ((x 0) (y 0))
(set (if t x y) 3)
x)
ってやってみたんだけど 0 が帰ってきて上手く束縛されない
set ってレキシカル変数には使えないと言うことだったのね
(set 'x 0) と (setq x 0) って等価だと思ってた
で上記を set から setq にしても上手く行かない
(setq (if t 'x 'y) 3) じゃダメだった(当たり前か)
setf でも判断できないしレキシカル変数にたいする set みたいな命令は無いのだろうか
>>870 最初の (if t x y) 間違いw
(if t 'x 'y) だった
スレストしちまった orz
873 :
デフォルトの名無しさん :2007/05/26(土) 01:10:34
今までLispは見た目わかりにくそうな感じなので全く使ったことなかったけど、今日暇だったことも あり、emacs lispを少し触ってみた。 意外と悪くないかなという感じなので、色々と使ってみようと思うんだけど、みなさんどんな 用途にLisp使ってます?
874 :
デフォルトの名無しさん :2007/05/26(土) 02:09:26
>>867 >>868 わかりました。
良く分からないですけど、大字にとっておきます。
>>869 誰がうまいこと言えと(ry
ちにみに「下らぬ本に感化されぬよう御注意」って書いてありました。
下らぬレスに感化されぬよう御注意
>>873 ちょっと重い計算。
あとはいろいろやりたいけど、そこまでやってない。Practical Common Lisp
と言う本のようにやってみたけどな。
878 :
デフォルトの名無しさん :2007/05/26(土) 15:05:01
(defun double (x) (doublex)) (defun doublex () (+ x x)) (setf x 7) (+ (double 0) x) =>21 ってC言語で言うと #include <stdio.h> int hoge (void); int i = 7; int main (void){ int i =10; int v = hoge(); printf ("%d\n",v); return 0; } int hoge(void){ return x+x; } と同じことでしょうか? そしてこれがレキシカルスコープってやつですか?
>>870 こんなんじゃ駄目?
(defmacro set-eval (place value)
(let ((x (eval place)))
`(setf ,x ,value)))
(let ((x 0) (y 0))
(set-eval (if t 'x 'y) 3)
x)
本スレの荒れっぷりを見て釣りっぽいのに安易に回答するのはどうかと思っていたけど。
>>878 C のコードの hoge 関数が間違っているよ。x => i に置き換えれば挙動は似ているが、C の動作に
おきかえて Lisp を理解するのは良くないと思う。C の main 内の int i がレキシカルスコープというなら
そうかもしれないが、たとえば C では main 内の int i をクロージャに閉じ込めて main のスコープ終了後に
使うという事ができない…といっても C で理解していると main が終った後(C では main は特別な関数だからね…)?
クロージャ?ととりあえず関係無いところでひっかかるからね。
>>879 ダメだと思うよ。それマクロ展開時に値が確定しちゃうから元の C や Perl 版とは挙動が異なる。
素の CL ではシンボルからレキシカル変数の値を実行時に取得することはできない。
個人的には不要と考えているが、どうしてもやりたきゃ展開形を↓のようにする必要がある。
(if 条件
(setf x value)
(setf y value))
やってみた (defsetf if (test then &optional else) (v) `(if ,test (setf ,then ,v) ,(if else `(setf ,else ,v)))) (let ((x 0) (y 0)) (setf (if t x y) 3) x)
>>879 おぉー出来た、すごい
>>880 氏の弁だと if の部分がコンパイル時に評価されちゃうから実はダメってことなのかな?
でもコード書いてくれてありがとう
感謝
>>880 たしかに言うようにこういう処理自体やる機会ってのはほとんどないし利点も薄いから
たぶんアプローチ自体間違っているんだろうね
ただ Lisp は他の言語では制御構文でしかない if でも値を持っているのでこんなの簡単にできる
と思って意地になってハマっちゃったよw
>>881 おぉぉおぉおおおお!
でけた!
defself ってこう言うときに使うんだぁ
言語で言語を拡張すると言う Lisp のハック精神炸裂だ
よっし、C や Perl に勝った!
オレってなんて稚拙な精神構造なんだろ
とほほ
defsetf だった もうこんなんばっかw それにしても Lisp はおもしろい
>>881 コメントさせてもらうと、else を省略可能にしないほうがいいね。
(setf (if nil x) 10) とかのケースを考慮しないと。
>>882 そう、if に関してはアプローチが間違っている。Dan Kogai の出してる例だと
substr 等に関しては setf が一般解を出している。setf を拡張可能にする事により、
ユーザーが定義したデータ構造にも setf できるようになってるわけ。
でも、あまり黒魔術的な技で勝ち負けを考えないほうがいいと思うよ。C や Perl がチャンピオンだからね。
言語勝負厨は来ないでほしい
厨って言葉を使って、勝った気になってる奴うぜー
┏┳┳┓ ハイ. ┏┳┳┓ ┏┫┃┃┃ 雑談は ┃┃┃┣┓ ┃┃┃┃┣┓ ここまで ┏┫┃┃┃┃ ┃ ┃┃┏━━━┓┃┃ ┃ ┃ 雑談 ┣┫ . ・∀・ ┣┫. STOP!┃ ┗━━━━┛┗┳━┳┛┗━━━━┛ ┏┻┓┃ ┏━┛ ┣┻┓ ┗━━━┫ ┗━┓ . ┗━━━┛
>>884 判ってるよw
だからとほほな精神構造だなと自戒しまして
しかしマクロが強力な Lisp は黒魔術の幅も広そう
他の言語だと結局言語を再実装する形になりそうだ
ただマクロは強力すぎるから適用範囲を掴むまでは手を出せないかなぁ
On Lisp と Shiro 氏のマクロの記事読んで感覚はつかめたけど
たぶん解っているだけで判っていないと思う
最近の動的言語のパズル的魔術を黒魔術とすればLispのマクロは白魔術ですよ
JavaScriptって地味に黒魔術の塊だとおもってたんだけど、 リフレクションに類するものは非推奨になってるんだな。つまらん。
clisp何でインデントしようしてもtabキーが使えないんですけれども、 これって仕様ですか?
>>893 コンパイル時にreadlineライブラリが組み込まれてないんじゃないかなぁ。
*features*は確かめてみた?
>>892 プリコンパイルしてJVMやCLIで(JavaやC#並に)効率よく動かそうというというのがあるから、
動的言語でもそういう機能は嫌われる傾向かも。(スレチすまん)
896 :
デフォルトの名無しさん :2007/05/27(日) 14:34:20
deduceってどういうときに使うの?
ごめんreduce
>>896-897 ちょっとでも計算量を少なくしたいときfold⇒reduceにする。
集合が単位元をもたないときもreduceを使わざるを得ない。
>>890 適用範囲はかなり広いから、やれなくなるよ。
ちょうど、孫悟空が三蔵法師らと天竺にでかけるが、近づこうとすれば
遠くなるみたいな感覚はにてるよ。w
ひさしぶりにLispの本を買いたくなって本屋で色々見たけど 結局お金が足りなかったので何も買わずに帰った
まず金を稼ごうぜ
Lispやれば金になるよ。 なんてな。
金持ちの lisper なんて本当に存在するか疑問だ…
むしろ金持ちだからこそLispができるのではないかと
グラハムっちは金持ちじゃないの?
(defun expt$ (m n) (if (= n 0) 1 (* m (expt (- n 1) m) ))) すごい恥ずかしい質問なのですが、 expt$ (m n)と関数定義して、 (expt (- n 1) m)で引数の位置入れ替えているのに なんでちゃんと計算できるのでしょうか? JavaとかCでもちゃんと計算できましたっけ? Lispが特殊なの?
なんでちゃんと計算できていると思ったのですか?
変な質問で申し訳ないが、lispでこれができるから好きっていうのがあると思うんですが、 lispのどこが好きですか? lispのソース付でお願いします。 lispはかじっただけで、まったく知らないに等しいのですが、出力を意識しなくていいのが好きです。 '(javaだとSystem.out.print("??????")\;とか大変なんですよね。)
「ハッカーと画家」でも買って読め
>>908 > 出力を意識しなくていいのが
アハハハハハハハハハハハハハハハハハ
>>907 私が馬鹿でした。
そりゃこの関数で
2の3乗計算しても同じ結果になるはずだ。
こんな罠があったとは!
windowsでclisp, allegro, sbclを入れて、どれがアプリの配布に 向いていそうなのか見てみたんだけど、簡単なレポあった方がいいかな?
>>912 それだと CLISP だろう…
CLISP: スタンドアロン .exe 化できる。この中だとサイズも小さめ。
SBCL: Win32 はまだいろいろ制限多い。ランタイムデカいので .exe 化のメリットあんまりない。
ACL: .exe/.dll 化可能。だが、そもそも配布用ラインセスが高額。個人では無理。
LispWorks: .exe/.dll 化可能。Professional 版以上にはランタイムライセンスがついてくる。日本語回りは未知数。
915 :
908 :2007/06/01(金) 22:59:08
>>913 昔、若気の至りで買った"common LISP 第2版"を見てるんですが、compileとdisassembleの所ってかなりのページ数がさかれてて、仕様としてかなり確りしてそうですね。
かなりのページ数なので、読もうとして気が遠くなりました。^^
>>914 確かにその通りだった。hello表示させるだけで、CLISPはイメージと
ランタイムあわせて8Mくらい。SBCLは20Mくらい。
ACLはTRIALバージョンだと、exeを実行するたびに、「sutdent ver買ってね」と
言われる。
少し間口を広げて、ISLISPのOpenLispも試してみたんだけど・・・
Freeバージョンはexe機能ないのね。マニュアルにはやりかたが
書いてあるけど、仕様が変わっていてあんまり役に立たない。
exe化のための、中途半端な機能だけ残ってた。
っていうか、ソースがOpenじゃないのに、OpenLispとは・・・
>>916 GCL や ECL とか?うーん Windows じゃあイマイチだねぇ。というか Lisp のほうが
「フリーソフト」だの「オープンソース」だのより古いんだからそゆ批判はちと的外れかも。
RMS も元は Lisp システムが使いたくて GNU はじめたのにね。まぁ、Symbolics の件もあって
CL は好きじゃないらしいが。
>>917 日本語がダメです。英語のみならかなりコンパイル速度といい統合されてるアセンブラといい
イイ処理系なんだけどね…。
>>918 ついちょっと愚痴ってしまいました。いや、実はオープンソースでないことに
対して愚痴っていたのではなくて、紛らわしいところに愚痴っていたのです。
standalone exeができると書いてあったので、マニュアルみながら試行錯誤したら
全然マニュアルどおりでなく、仕方なくいろいろと付属のライブラリの中を見ると、
ISLISPをCにコンバートするものがあったんですが、その吐き出すCのコードをコンパイルするのに、
本体のコードが必要。それで"Open"ってついているからきっとどこかにソースが・・・と探して
徒労に終わってしまったので、つい(^^;
そうそう配布を考えなければ、SBCLはwindowsでも結構いけますね。
LTkも使えたので、GUIもOKでした。速度もCLISPに比べて10倍くらい速い。
スレッドは使おうとするとハングしてましたけど、意外といい感じでした。
lispはいい言語ですね。初めてソース見たときは、どう読んだらいいか
わけわから、ずかなりインパクトありましたけど。
実は私も OpenLisp 経験があったりして。昔触ってた鯖に、なぜか OpenLisp が入っていてね。 Lisp はいい言語けど、最初のインパクトとうか精神的ダメージはでかいだろうな。見た目がアレだから。 よく再チャレンジする気になったね。2ch で聞くくらいだから身近に Lisp の師匠居ないんでしょ? 俺は師匠に出会わなきゃいろいろ理由をつけて蔑んでたままだったろうなぁ〜と今でも思う。 そうそう、TIME マクロも結構好きだね。俺は他の言語では profile する前に t1=timeGetTime(); 処理; t2=timeGetTime(); print(t2-t1); .. みたいなお手軽計測を多用する ダメ人間だったからね。TIME マクロみて、コードを「包み込む」系のマクロの便利さを知った。
ACL高いって話を良く聞くけれど、 じっさいお値段はいくらくらいなの? Franzのページにもお見積もりとか書いてあるだけだし
(defun C (n k)
(if (= k 0) 1
(if (= n k) 1
(+ (C (- n 1) (- k1))
(C (- n1) k)))))
という関数で(C 4 3)の時の評価の過程が良く分からなかったので、
図に書いてみたんですけれど、もしよければ正しいか見ていただけないでしょうか?
http://pc.gban.jp/?p=9066.jpg
その理解で正しいと思うよ。 さらに (TRACE C) を使ったあと (C 4 3) を実行すると確認が楽。 CL-USER> (C 4 3) 0[6]: (C 4 3) 1[6]: (C 3 2) 2[6]: (C 2 1) 3[6]: (C 1 0) 3[6]: returned 1 3[6]: (C 1 1) 3[6]: returned 1 2[6]: returned 2 2[6]: (C 2 2) ... 以下ズラズラと表示される。ただし、深い再帰で表示すると終わらないので、そゆときは自力で print 入れるとかしよう。
Win32でcusp使ってみたけど、Eclipse終了しても、SBCLがゾンビで残りません か?(しかもCPU占有率50%程度で) XP SP2, Eclipse3.2.2, Cusp for Windows 0.80 = sbcl 1.02 心当たりありましたら、ご教示いただけましたら幸いです。
Cusp ってのは単に Eclipse が SLIME プロトコルしゃべるだけだと思うから、 Eclipse 側で終了時に SBCL を止める設定をしないとまだ残るでしょ。 SBCL 側を (quit) するようにフックしないといけないと思うんだけど Eclipse 手元にない。 SBCL も 4 ヶ月近く前の版ってことは Cusp ってあんまりメンテされてない? Emacs + SLIME のほうがオヌヌメかも。
>>925 ご教示ありがとうございます。了解しました。
Eclipseを終了してから、SBCLを終了するということですね。
まだ使いはじめたばかりで、設定がきちんとできていなかったかもしれません。
windows+xyzzyを使っているので、emacsはなんとなく抵抗があるのですが、
emacs+slimeも検討してみます。
>>926 間違い訂正
Eclipseを終了する前に、SBCLを終了するということですね。
>>928 100万超じゃなかったっけ?
かなり昔にOまたさんに聞いたのだが。下がったのかな?
Edition によると思われ・・・。個人利用は Professional でいいけど会社で使うなら Enterprise でそ。
>>928 >>929 >>930 なるほど、ACLのお値段はそれ位するのですか。
でも、思っていたよりは普通。
RISCマシン用の商用コンパイラもそれくらいするのが普通だし。
932 :
918 :2007/06/02(土) 14:49:06
>>920 実はlispはxyzzyのカスタマイズなどに使っているので、今では
普通のコードを読むのと対して違いを感じないんですが、
初めて見たときは驚きました。その当時いくつか読める言語が
あったんですが、読み方がさっぱりわからなくて。
emacs, xyzzyはlispのとっかかりとしてはいいですね。
豊富なソースと、簡単に動作確認できる環境が師匠って感じです。
933 :
918 :2007/06/02(土) 14:50:26
ところで、ECLについてもちょっと試してみました。 配布を考えるなら、windowsではECLが一番いいかもしれません。 (ただし、Cコンパイラが別に必要) hello表示させるアプリで、全部で1.5M程度でした。(ecl.dll + test.exe) もちろん、exeになります。あとコンソールアプリで日本語表示もOKでした。 Cとの親和性がとてもよく、Cができれば組み合わせていろいろできそうです。 コンパイルは一度Cのコードを吐き出して、インストールされている コンパイラを使ってコンパイルする形になります。 またVisual C++2005を使って、ソースからコンパイルすることも可能でした。 その場合は、一部ソースを直す必要がありましたが、Cがある程度わかる人であれば 問題がない程度です。VC++の最適化は強力なので、こっちができる人は こっちの方がいいかも。
>>923 ありがとうございます。
TRACE関数はまだ勉強していないのですが、
便利ですね。
これで紙の上で書かなくて済みそうです。
ついでに末尾呼び出しについての質問です。
(defun gcd$ (m n)
(if (= m n) n
(gcd$ n (mod m n))))
の場合、末尾呼び出しとは
(gcd$ n (mod m n))の事をさすのでしょうか?
それとも(gcd$ 30 18)とした時の、
評価していって(gcd$ 12 6)になった時のことを言うのでしょうか?
末尾再帰は理解できるのですが、
本には以下のように説明してあるのですが、
「末尾呼び出しとは値を返す直前の関数呼び出しのこと→(gcd$ 12 6)
末尾呼び出しが再帰呼び出しになっているのが末尾再帰です→(gcd$ n (mod m n))」
とどちらともとれる説明になっていて困っています。
>>934 1. (gcd$ n (mod m n)) の個所が「末尾呼び出し」の定義
2. 実際に実行される (gcd$ 12 6) が「末尾呼び出し」する
普通は JMP 命令になる。
普通の関数呼び出しでも、たとえば (mod m n) は関数呼び出しの定義で、
呼び出しの実行は (mod 30 18) なわけ。でもどっちも「関数呼び出し」って
言えば通じるよね。末尾再帰も慣れればいちいち定義と実行を分けて考えなくなるよ。
936 :
デフォルトの名無しさん :2007/06/02(土) 21:03:37
引数の絶対値を返す関数をifを用いて定義したいんですが、どうやりますか?
(defun my-abs (x) (if t (abs x))) 1. 絶対値の定義は何か、日本語なり自分のわかりやすい表記なりで書け 2. その表記では何らかの条件はないか、あるならそこに if が当て嵌められる 3. 条件はどんなものか。それは Lisp で書くとどうなる? 4. 条件が真のときは何を返し、偽のときには何を返すか。それは Lisp で書くとどうなる? というステップを踏めば書けるだろ。あとは教科書でも読んでちゃんと復習しろ。
なんというゆとり…これは間違いなく宿題。宿題なら宿題だとはっきり言わないと組込みの abs 関数使えで終ってしまうぞ。 (defun abs-936 (x) (if (minusp x) (- x) x)) もう、ここまでは読まないかもしれないが、別に宿題なら宿題ではっきり授業聞いてませんでした助けて!! と言えばいいのに。なんでバレバレの質問するんだろう。真面目な回答者なら逆に気分を害して答えてくれないかもよ。 俺は本人のためにならない事大好きだからバンバンこたえちゃうけどね。
>>937 >>938 は真面目すぎ。授業聞いてなかったのを後悔してるわけじゃねーんだぜ。
興味も関心もないんだって。本人が努力なんてする気もないんだから考え方とか教えても無駄だろ。
Emacs Lisp スレでも書いたが、興味もやる気もないし、礼儀もしらないんだから荒しと考えてさっさと
回答を与えて満足させるべき。
で、宿題なんだから minusp もダメだろう。おそらくベストな答はコレ。これで○もらえるはず。
(defun my-abs (x) (if (< x) (- x) x))
940 :
937 :2007/06/03(日) 00:00:30
>939 その意見には反対。興味がなくて授業も聞いてなくて、それでこういう場で宿 題を聞いているのだろうというのには同意するけど、そのまま答えを与えては いけないとおれは思う。 こういうやつに答えをそのまま渡したらアホがアホなまま、なんとなく単位を 取れてしまうだろ。それが一番まずい。 それよりは、自力で解かせるべくヒントだけを与えた方がいい。それで自分で 問題を解けるようになればベストだし、そこでやる気を見せないやつは落第し た方がいい。
>こういうやつに答えをそのまま渡したらアホがアホなまま、なんとなく単位を 取れてしまうだろ。 社会にアホが
このスレのレベルが急速に低下してるな……
944 :
937 :2007/06/03(日) 00:28:49
あ、「真面目すぎ」ってのについては賛辞として有難く受け取っておきます。 そもそも、やる気がなかろうが話を聞いていなかろうが、これが講師やTAなら、 そんな学生の事情とは関係なく、きちんと理解させるような教育をしなきゃいかんのよ。 宿題系の質問て、ようするに授業で対応しきれない学生へのTAの仕事をボラン ティアでやっているのと同じなので、質問に答えるなら、同じようにちゃんと 質問者を教育する態度で臨まなければならない。 っておれは思っているので。
真面目だな
946 :
939 :2007/06/03(日) 00:43:42
>>937 おまえ良い奴だなぁ。結構感心すた。まぁ、理想は買うけどね、実際のとこ
宿題って事を偽装したつもりでネットの暇人が答え書いてくれるだろうとか浅知恵する連中は
自分で考えたりしないし、感謝もしないよ。連中は答えを写して提出するだけ。
でも今後は「宿題であること」「やる気がありません」と明言されていない場合は
ズバリ答えを書くのは控える事にする。
……まぁ、Common Lispの宿題なんてのがそうそうあるとは思えないが。
>>935 とても丁寧な回答ありがとうございます。
しっかり理解できました。
>>936 自分ならこうしますかね。
abs(x)
-x,x<0の時
x,それ以外の時
↓lispにすると
(defun abs$ (x)
(if (< x 0) (- x) x))
absは組み込み関数だから関数名はabs$にしました。
Common Lisp 系のインタプリタ処理系をC++で実装しているんですが、 別に Common Lisp に詳しいわけじゃないので、 自分が知らない機能があるかもしれません。 せっかくなので一通りは実装したいのですが、 Common Lisp らしい(?)機能ってどんなのがあるでしょうか? ちなみに GC とか クロージャは実装できました。 末尾再帰とか遅延評価とかって Common Lisp にあるんでしたっけ?
すいません、ちょっとお尋ねします。 windows上のcommon lisp処理系で使える、以下の条件を満たす プロットライブラリを探しているのですが、どなたか心当たり ありませんでしょうか。 1. GUIで拡大縮小できるもの 2. 1.を満たし、かつ一画面に複数のグラフを表示できるもの 3. グラフを印刷可能なもの(もしくはpost scriptで保存できるもの) (4. できれば、ソースが手に入るもの。) いろいろと試してはみたのですが、どうもいいものが見当たりませんでした。 (gnuplotはマルチプロットした状態で、GUIで拡大縮小すると表示が おかしくなります。またclplotは表示などはよさそうなのですが、 元になるplplotのライブラリは、windowsではマウスのイベントを 取得できるドライバが使えないようで、GUIで操作は難しそうです) もしご存知の方がいましたら、よろしくお願いします。
>>948 自分もあまりCommon Lispは知らないけれど(質問ばっかりしてるし)
まずはCommon Lisのインタプリタを作る以前に
Schemeのインタプリタから
作った方が良いと思う。
末尾再帰
(defun factorial (n)
factorial-loop (n 1 1))
(defun factorial-loop(n i p)
(if (> i n) p
(factorial-loop n (+ 1 i) (* i p))))
(factorial 5)
↓
(factorial-loop 5 6 120)で返るよ。
再帰は
(defun factorial (n)
(if (= n 0) 1
(* (factorial (- n 1)) n)))
遅延評価は
On lispの214ページに実装例が書いてあります。
自分もいつかインタプリタ作ってみたいなぁ。
今読んでる本の最後の課題で作るけど。
お恥ずかしい (defun factorial (n) (factorial-loop n 1 1)) で。
>>948 Lisp らしいというとマクロだろうね。もう実装済みかもしれないけど。
あとは何だろう。多値とかかな?
末尾再帰があるとは?最適化が仕様で要求されてるかということなら、されてないよ。
遅延評価も仕様にはなかったと思う。
>>953 レス、どうもありがとうございます。
linux上ではplplotはマウスイベントを取得できるドライバが使える
ようですので、clplotからplplotを呼び出したりすればできそうな気がします。
(結構手はかかりそうですけど)
あとcommon lispではないのですが、lushという処理系がありました。
これはマウスイベントを取得する描画ルーチンがありましたので、
自分でプロッターを作ることはできそうです。どうやらこの処理系は、
数値計算重視のようですね。Cのコードをはいたり、独自の拡張で
Cのコードを中に埋め込むことができるみたいです。
(しかし言語仕様はcommon lispとはかけ離れていますけど)
う〜む、なかなか難しいですね。
少しずつlispで使えそうなライブラリを作って、いずれ大体のことは
lispでできるようにトライしてみます。
>>950 >>952 >>953 どうもありがとうございます。多値なんてありましたね。
とりあえずはオプショナル引数とバッククオート文法あたりですかね。
プログラマブルなリーダーは
普通のS式の構文解析の時点でヒーヒー言っているんで…
ちなみに何で Common Lisp 系と言うと
自分が一番使っている処理系が xyzzy だからです。
xyzzy ならその場で実行できるしソースも見れるしと。
とりあえず現在たらいまわし関数を実行してみたんですが、
(tak 10 5 0) が xyzzy が1秒ぐらいで終わるのに
自分の処理系だと20秒ぐらいかかって遅すぎ…
まてまてまて。まずさ、Lisp を作るんなら Lisp の勉強からはじめてみたらどうかな。
S 式の構文解析でヒーヒーとか、 (tak 10 5 0) で 20 秒というあたりからあんまり
C/C++ の経験もなさそうな気配。
CLISP で↓のようなドシンプルなインタプリタ動かしても 20 秒もかからないんで、どっかに
相当なムダがあると思われる。CLISP 2.41, PentiumM 1 GHz で 0.5sec だ。
http://lispuser.net/memo/lisp/2006-12-08-03-54.html 新機能もいいけどまず足場を固めてみてはどうだろうか。ソースのレビューくらいしたげるよ。
(でも GC が自作できるとの事なんで、ひょとすると見誤ってるかもしれないけど)
>>948 実行系の設計に関するものに絞るとしても、とりあえず
signal/condition-case, catch/throw, block/return-from
くらいは必要でしょ。このへん無視すればそりゃ簡単だけど。
ほかには
>>953 が書いているようにリーダーとかマクロ回り。
>>956 実は lisp C++ 共に経験はぜんぜん無いです。
まあ両方の勉強の為にやってるとも言えます。
だから実装効率は無視してクラスの設計を優先しました。
(だからって良い設計とはいえない気がするが)
ちなみに以前C#で作った処理系だと2〜3秒程度でした。
(クロージャなし、GCは.NETまかせ)
とりあえず遅い理由は cons をいちいち new しているのか
シンボルの束縛されている値と関数の取得が毎回
std::map<std::string, Symbol*>クラスの検索をしてるからっぽいですわ。
>>957 あああ、制御系をすっかり忘れてました。
この辺ぜんぜん考えてなかった…
少なくとも block/return-from は無いと駄目じゃん…。
まだ実力があんまり測れないなぁ。値の取得が <std::string, Symbol*> ってあたりからすると、毎回文字列からシンボル引いてるの? そうだとすると、処理系製作するには Lisp の知識というかカンが不足してる気がする。普通の S 式はシンボルのツリーになるから 実行時に文字列からシンボルをいちいち引いたりしない。あと GC はどんな方式? C# や C++ のテンプレートライブラリが使えるのに S 式の解析がつらいとか、技術レベルがちょっと ちぐはぐな感じ。やる気はありそうだから、やっぱ作る対象もちゃんと勉強したほうがのびると思うよ。 いろんな言語で同じ水準の半端 Lisp を実装するより、まず腰を据えて Lisp に取り組むするほうがオヌヌメ。
>>960 Symbol のクラスは std::string を持つだけのクラスで、
そのシンボルにどの値が束縛されているのかは
全体のテーブルから引く形になっています。
普通はSymbolに値と関数の領域を持たせるんですよね。
xyzzy のソース見てもそうなっていました。
GC はシンプルな Mark & Sweep で一応Cレベルのマシンスタックも走査しています。
この辺は Ruby のソースを見て参考にしました。
CG の最初と最後に printf しているのですが、
ぜんぜん時間はかかっていないみたいです。
S 式の解析は途中で継続可能(?)なのを作ったんですが、
この継続可能ってのが曲者でした。
説明しづらいですが、文字列をどこで切っても解析可能というか。
一段落したら Lisp の勉強をした方がよさそうですね。
960に同意。普通はシンボルマップを検索するのはreadするとき(正確にはinternするとき)だけで済むはず。
>>958 > シンボルの束縛されている値と関数の取得が毎回
> std::map<std::string, Symbol*>クラスの検索をしてるからっぽいですわ。
この辺が不思議。束縛をシンボルに入れるか外側に入れるかは、いろんな流儀があるけど、
どちらにしても文字列で検索するなんて話は出てこないはず。
ひょっとしてSymbolというクラスのインスタンスは同一文字列でも一つではないとか?
それって eq とか困らない?
Lispのシンボルをまだよく理解してないってだけでしょ。 そうつっつかなくてもいいじゃん。 eqだってinternされてないシンボルというのがない(かつパッケージもない) 世界ならシンボルだけ特別扱い文字列比較でもいけるっちゃいけるんだし。
>>964 eq と eql の区別がほどんど無意味になるけどね
>>964 なんか、つっついてあげれば理解してくれる子だと思ったもんでつい・・・w
いや、つっつくというより、皆なんかちぐはくな感じを受けてるんじゃないかな。 C# でも Lisp 作った事あって、最低でもこれが 2 作目なんだよね。 xyzzy のソースまで読んでるのに Symbol の intern を知らないとか、 Ruby の GC を参考に、C スタックのスキャンまでできるのに?(プロファイルはprintfベース?) S 式の解析が継続可能?作る対象の勉強が後回しとか、 うーんいまいち実力が見えないんだけど。ソースを見せてもらうのが一番はやそうだけど、そゆの抵抗がある人? xyzzy だと Windows 系だろうから見せると減るって人が多いかなぁ。まぁ、順序を追ってやったほうがいいと思うけどねぇ。
>>967 本人が「ソース読んだ」といってもそこに書いてあること全部読みとった
とは仮定しない方がいいと思うよ。本人の書く内容から推す経験値からしても。
なぜGCの知識はRuby由来かというと推測だけどおそらくRHGの存在によるんじゃない。
本人さんには現在実装しているサブセットの仕様を整理してもらって、
Lispをよく知っている住人は次にそれをどう拡張・変更するのがいいかって
お題を示してあげればいいんじゃないかなあ。
eclで(load "test.lsp")として、その中で(defun test () (...))しているとして、 (test)としても、The function test is undefined.になってしまいます。 なぜでしょうか?根本的に間違っていますか?
970 :
948 :2007/06/06(水) 00:36:25
>>958 は std::map<std::string, Symbol*>クラスじゃなくて
std::map<Symbol*, 値>クラスの間違いでした。
構文解析の Symbol を作成する時に使うのと間違えてました。
>>963 Symbol インスタンスはプールしていて同じ文字列の場合は
以前作成したのを返却するようにしています。
>>964 実はinternもよく分かっていないんですよね。
Rubyや.NETなら文字列の値に対して一意に決まる値って感じだと思ってましたが。
>>967 別に抵抗は無いですが、匿名でいたいかなぁとかなんとか。
あぷろだであげればいいのかしら。
>>968 その通りRHGで見よう見真似(というかコピペ)です。
あとぐぐって出てきたのを拾い読みしてる感じですかね。
>>970 > std::map<Symbol*, 値>クラスの間違いでした。
心配したほど酷い処理系じゃなさそうだな。w
非標準だけどhash_mapあたりを使えば速くなるかも。
>>969 Load に失敗してるんじゃないの?としか言えない。load を実行したときのメッセージと
test.lsp の中身を見せてみて。
ecl の実行時カレントパスと test.lsp の置き場所がずれててロードできてないとかじゃないか。
>>970 あぷろだでいいと思うよ。
973 :
969 :2007/06/06(水) 09:15:16
>>972 ありがとうございます。
eclからrdnzlのサンプルを呼び出しています。
下記のとおりになります:
D:\ecl\ecl\msvc>ecl2
ECL (Embeddable Common-Lisp) 0.9i
...中略
Type :h for Help. Top level.
>>> (load "rdnzl/load.lisp")
;;; Loading "D:/ecl/ecl/msvc/rdnzl/load.lisp"
...中略
;;; Loading "D:/ecl/ecl/msvc/rdnzl/direct.fas"
"D:/ecl/ecl/msvc/rdnzl/load.lisp"
> (load "rdnzl/examples/apropos.lisp")
;;; Loading "D:/ecl/ecl/msvc/rdnzl/examples/apropos.lisp"
"D:/ecl/ecl/msvc/rdnzl/examples/apropos.lisp"
> (run-apropos-form)
The function RUN-APROPOS-FORM is undefined.
Broken at EVAL.No restarts available.
Broken at EVAL.
974 :
969 :2007/06/06(水) 12:35:20
上記のecl2はECLのサイトのwiki→platform→WindowsXP内の記載に従い、 VC2005 Standard(Expressではなく)でビルドしたものになります。 rdnzlはサイト中にあるvc8対応の0.5ではなく、0.6.0を使用しています。 (一番最初のExamplesは動いたので)
>>974 え〜っと、runさせる前にこれ実行してみたらどうだろう。
(in-package :rdnzl-user)
余談だけど0.9iはバグがあるのか、他のライブラリでも動かないことがあるね。
あと困ったことに、VC++は一つの配列で持てる文字列の大きさに制限があって、
eclで大きなファイルをコンパイルしようとすると、そのせいでコンパイル
できないことがある。ちゃんとコンパイルが通ったかは、注意した方がよさそう。
(gccにはそういった制限はなかったので、gccでコンパイルするって手もある)
VC++でそれを回避するには、compile-fileではなくて、compileで関数を
一つずつコンパイルすればいいのかもしれない。
976 :
974 :2007/06/06(水) 19:34:48
>>975 すばらしい!無事ロードし、実行できました。
(in-package :rdnzl-user)は、lispファイルの一番最初で実行されているので
不要かと思いました。
ご教示ありがとうございました。
>>970 google の捨てあどとって google code とか
978 :
948 :2007/06/07(木) 02:04:55
とりあえず現状のをアプしてみました。
http://deaikei.biz/up/ の 5673.zip です。パスは lisp で。
まだデバッグコードが入りまくってます。
スタイルは C#(というかMS系?)でやってます。よろぴく
拡張子cppだからC++なんだよね? 駄目もとでg++でコンパイルしたら、friend Hoge;はfriend class Hoge;でないとあかんやろーみたいなエラー出まくった。 後、std絡みのクラスの問題だと思うけど、例外系絡みぽいエラーが続発。 酔ってるので詳細はよくわからんし、調べもしてないけど。なんかデストラクタの宣言を指してエラーにされてる箇所もあった。 非MS系での報告ですまんが、万が一何かの役に立てば幸いですw
C言語で言うtokenみたいなものってないんすか? コマンドの解析をしたいんだけど cmd=print data=hello これをcmdがprintで 表示のデータがhello というように解析したいのですが
(cmd "print") (data "hello") とか書いてもらって、readで済ますのがLisp流
>>982 乙
このスレが3スレ目まで行くとは凄いな
変数に関数を放りこんで、それを後から取り出して実行するのはどうするの? (setf test #'(lambda () (format t "hello"))) (test) みたいな感じのことをしたい. gethashでデータと一緒に関数を入れておいて maphashで取り出して実行みたいなことをしたい なんか良く伝わってないかもしれないが、よろしくお願いします.
このあたりダサいよね CL って。
コンピュータ言語なんてもんは、実務でバリバリ使える効率性と柔軟性がありさえすれば、 ダサかろうが汚かろうが何の問題もありゃしません。
そんな所で頑張る必要なんて無いじゃない
ここは CL スレだからいっとくが、funcall がダサいって決めつけるのはいくない。 名前空間がわかれてないせいで kons とか lis とかって変数名になるのはカコイイのか? 関数呼び出しが (((generator))) とかなるのがカコイイのか? 構文の括弧なのか関数呼び出しなのかは構造みないとわからないのがカコイイのか? 実際に何段階呼び出すのかは *括弧を数えないと* わからないのがスマートなのか? (CL なら funcall 数えればすむ) まぁ、好みの問題なんだけどさ…。
funcallを隠したければリードマクロなのかな?
最近の関数型言語だって funcall なんて頭悪そうなの使っているのは無いよ 普通に呼べる
cl でも lst 使うからまったく名前は被らないな 常に funcall 書かなきゃいけないのとたまに使うかも知れない関数と同名のシンボルとどっちを取った方がいいのか cl のソースは funcall のせいで大分読みづらくなっていると思う arc とかどうだったっけ?
同じ (foo ...) だと、まず foo って名前の関数があったっけ、いやいやローカルスコープだ、って感じ
に思考が動くが funcall があると明示的で追いやすいという言い方もできる。
目くじらを立てるほど、どちらが良いとか、どちらがダサいとか言う問題ではないと思う。
なんか鬼の首でも取ったかのような
>>986 とその応援隊(?)が痛々しいよ。
funcallあると追いやすいってどうしてよ 関数コールなんて見て一発で判るでしょ 逆にfuncallがあったほうが要素が多くなって追いにくくなるよ 前置記法なのにそこに関数がないんだから構造が変わってしまう
999 :
992 :2007/06/13(水) 00:42:58
なんでトレードオフがわからずに俺の気に入らない物をつかってるやつはバカみたいな極端に走るかねぇ。 俺の師匠とか、昔の Schemer はそんなじゃなかったけど、これも時代かねぇ。何にでもこれ一つでおっけーみたいな ものや、最強のなんちゃらみたいなものを求めるというか。考えを固定したってあんま良い事ないと思うんだけど。 そんなに funcall が嫌なら隠せばいいでしょって事ね。 (defmacro with-suck-lisp1-style (functions &body body) `(macrolet ,(mapcar (lambda (e) `(,e (&rest rest) `(funcall ,,e ,@rest))) functions) ,@body)) CL-USER> (setf f1 #'cons f2 (lambda (x y) (cons y x))) ... CL-USER> (with-suck-lisp1-style (f1 f2) (f1 f1 (f2 nil f2))) (#<SYSTEM-FUNCTION CONS> #<FUNCTION :LAMBDA (X Y) (CONS Y X)>)
>>998 > 関数コールなんて見て一発で判るでしょ
ここに意見の相違があるわけ。俺は「常に一発でわかるとは限らない」と考えている。たとえば ((foo) ...) というコード片を見たとき、
Scheme だとその構造の一個上 (cond ... ((foo) ...) まで見ないと、cond の節かどうかその断片だけじゃわかんない。
CL スタイルなら ((funcall foo) ...) と cond の条件節みたいな構造の括弧 ((foo) ...) は一目瞭然。
funcall があったらそれは構造をあらわす括弧じゃなくて関数呼び出しの式という事がわかる。
これはコードを読む時に意識する範囲を狭める手助けとなる。少なくとも俺はね。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。