【入門】CommonLispその2【質問よろず】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2006/02/15(水) 23:08:04初心者のQ&A
本スレでは恥ずかしくて聞けない人のQ&A
本スレは高度すぎて割り込めない人のQ&A
linuxでなくてwindowsでやりたいんですが・・・Q&A
lispを使用してC#やJAVAの代替にするための方法(おまけ)
ま、ゆっくりたりましょう。
「いいものの本質は、いかなる時代においても変わらない」byパワーズ
前すれ
http://pc8.2ch.net/test/read.cgi/tech/1101386936/l50
0002デフォルトの名無しさん
2006/02/15(水) 23:12:140003デフォルトの名無しさん
2006/02/15(水) 23:14:07/
3
/
/
0004デフォルトの名無しさん
2006/02/15(水) 23:17:40ル
ポ
0005デフォルトの名無しさん
2006/02/15(水) 23:38:12(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 に移植中
:開発 そこそこ活発
:日本語 使えない
:特徴 元々商用のコンパイラ。ネイティブスレッドが使える。))
0006デフォルトの名無しさん
2006/02/15(水) 23:39:51(ABCL: http://armedbear-j.sourceforge.net/
:特徴 JavaVM 上で動く。JavaVM のバイトコードを生成。)
(ECL: http://ecls.sourceforge.net/
:特徴 Lisp->C コンパイラ。組み込み可能らしい。)
(GCL: http://www.gnu.org/software/gcl/
:特徴 日本発 Kyoto Common Lisp の直系。))
0007デフォルトの名無しさん
2006/02/15(水) 23:53:03http://www.lisp.org/HyperSpec/FrontMatter/index.html
http://www.cs.cmu.edu/afs/cs.cmu.edu/project/ai-repository/ai/html/cltl/cltl2.html
日本語のチュートリアル
ttp://web.sfc.keio.ac.jp/~t02064si/lisp2005/
ttp://www.h7.dion.ne.jp/~matsu/feature/common-lisp/index.html
ttp://www.geocities.jp/m_hiroi/xyzzy_lisp.html
ttp://home.soka.ac.jp/~unemi/LispProlog/
ttp://www.haun.org/kent/lisp1/
ttp://wisdom.sakura.ne.jp/programming/lisp/index.html
ttp://www-kasm.nii.ac.jp/~takeda/lectures03/titech/ai1/Text/CL.txt
進んだ話題が欲しい人に...
http://planet.lisp.org/
http://groups.google.co.jp/group/comp.lang.lisp
http://www.cliki.net/index
http://cl-cookbook.sourceforge.net/
http://www.gigamonkeys.com/book/
ttp://www.geocities.co.jp/SiliconValley-SanJose/7474/index.html
ttp://www.geocities.co.jp/SiliconValley-Cupertino/2478/root-sect-2.html
http://wiki.alu.org:80/
0008デフォルトの名無しさん
2006/02/16(木) 00:15:330009デフォルトの名無しさん
2006/02/16(木) 00:16:35http://pc8.2ch.net/test/read.cgi/tech/1132275726/
Schemer な人や、上級者 Lispnick はこちらへ。
0010デフォルトの名無しさん
2006/02/16(木) 02:52:31(POPLOG: http://www.cs.bham.ac.uk/research/poplog/freepoplog.html
Lisp, Prolog, ML のコンパイラ)
(WCL: http://wcl.kontiki.com/
Shared Library として使える Lisp)
(Movitz: http://common-lisp.net/project/movitz/movitz.html
フルスクラッチの Lisp OS)
(CADR LispM: http://www.heeltoe.com/retro/mit/mit_cadr_lmss.html
MIT で使われていた LispM のソースを公開したもの))
((その他のリンク
(Common-Lisp.net: http://common-lisp.net/
Common Lisp のプロジェクトが沢山ホスティングされている)
(Meme channels: http://meme.b9.com/start.html
Lisp の IRC Log)
(Paul Graham の ANSI Common Lisp:
http://www.pearsoned.co.jp/hed/search/onlinecatalog.html?id=276
Common Lisp の 参考書を探しているならこれ一択))
0011デフォルトの名無しさん
2006/02/16(木) 08:02:330012デフォルトの名無しさん
2006/02/16(木) 15:04:560013デフォルトの名無しさん
2006/02/16(木) 18:38:00合致する全てのファイルを削除するlisp式ってどう書きます?
前スレでも教えてもらったのだがABCLではどう書きます?
0014デフォルトの名無しさん
2006/02/16(木) 19:12:18(mapc #'delete-file (directory "/path/*.ext"))
0015デフォルトの名無しさん
2006/02/16(木) 19:51:12ありがとうございます
ここの人は優しいなァ
0016デフォルトの名無しさん
2006/02/16(木) 21:27:11同意。英語も平易だし。おまいら読め!
0017デフォルトの名無しさん
2006/02/17(金) 01:00:12ていく様子なのですが、そういうもんなんでしょうか?
たとえば、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を使っています。
どなたか情報お持ちの方教えてください。
0018デフォルトの名無しさん
2006/02/17(金) 01:13:56ガベジコレクタ様がよきに計らって下さるので、下々の者は気にしない、気にしない。
001917
2006/02/17(金) 01:30:53プログラムがやたら遅くなるので、やっぱなんとかならないかなと
思ってます。
ついでですが、>>17のfoo1は loop 〜 across 〜 summing を使った方
が見やすかったかもですね。
(個人的には loop は意味不明なのでなるたけ避けてる)
0020デフォルトの名無しさん
2006/02/17(金) 01:48:21002117
2006/02/17(金) 03:07:06(declare (type (array float (*)) array)) および (the (aref array x))
を入れてやってみましたが変わらずでした。
まさか、fixnum を越えるような値の場合は必ず一旦変換するのかなあ…
0022デフォルトの名無しさん
2006/02/17(金) 03:08:07失礼 (the float (aref array x)) です。
0023デフォルトの名無しさん
2006/02/17(金) 03:12:27integer でも fixnum を超える(most-positive-fixnum 以上になる)と
メモリ消費量が増えていくんじゃない? ACL は使った事無いけど...
002423
2006/02/17(金) 03:14:28optimize space とかも試してみたけど、ダメだった。
002517
2006/02/17(金) 03:44:41Allgro でも同様でした。
array を作るときならともなく、どうしてアクセスするのに
毎回メモリがいるんだろう… ポインタ辿ればすむ話じゃないんですかねぇ…
実は、Allegro の make-array には、
「特定の :element-type であれば、GCに触られないような static
な array のアロケーションができる」
っていういかにも期待できそうなのが独自拡張があるんですが、s
ingle-float を :allocation :static しても結果は同様でした。
http://www.franz.com/support/documentation/7.0/doc/implementation.htm#cl-make-array-2
0026デフォルトの名無しさん
2006/02/17(金) 03:58:00002723
2006/02/17(金) 04:01:02SBCL の 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
002823
2006/02/17(金) 04:02:300029デフォルトの名無しさん
2006/02/17(金) 04:28:44#'(lambda (x) (setq sum ...) (values)) だとどうよ。
0030デフォルトの名無しさん
2006/02/17(金) 06:32:42(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
とか指定すべきでは.
0031デフォルトの名無しさん
2006/02/17(金) 08:27:53持って行った。けど間違った結果が返って来る罠(w
(declareに:explain仕掛けて真剣にコンパイラと向き合わないとダメだろね。きっと。
0032デフォルトの名無しさん
2006/02/17(金) 11:11:26この場合非破壊的変更だから、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 してみよう。
003317
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
ではうまくいきませんでした。
なんだかいろいろと勉強になりました。
特になんでもコンパイラ任せにしてたのを反省できたのが収穫でした。
003517
2006/02/17(金) 12:26:17改めて>>32をAllegroCL7.0で
(declare (optimize (speed 3) (space 0) (debug 0)))
で動かすと、これは(ACL8でなくとも)見事定数でした。
>>33で「ACL7だめじゃん」って思った俺がだめだめでした。
003630
2006/02/17(金) 22:30:44すまん。 simple-vector と svref な。(simple-array と svref で debug 0, safety 0 じゃバグるって)
SBCL 0.9.9.31 と LispWorks 4.4.6 ともにコンス無しにできたよ。
0037デフォルトの名無しさん
2006/02/18(土) 01:07:11人づてに聞いた話では古参Lisper達は「コンパイルしたらコードがどう生成されるか」を
常に意識してS式を叩いていたそうな。
近頃の若いモンはなっとらんと叱られたけどそんな細かいところまでチューニングする
必要に駆られることあまり無いからね。やるにしてもプロファイラ使ってちゃんと
追い込んでいかないと要らんトコ最適化してたりするし。
0038デフォルトの名無しさん
2006/02/18(土) 08:54:33Cプログラマでもやるよ。
おれはヘタレなスクリプト言語しか使えないけど…
0039デフォルトの名無しさん
2006/02/18(土) 09:20:530040デフォルトの名無しさん
2006/02/18(土) 14:03:54でもLispならパターン決まっちゃえばあとはマクロで楽々だからな。
C++ のテンプレートとかも気分的には近いものはあるが。
0041デフォルトの名無しさん
2006/02/18(土) 14:20:49004210
2006/02/18(土) 23:58:360043デフォルトの名無しさん
2006/02/19(日) 01:27:12長いリストになったねw
0044デフォルトの名無しさん
2006/02/23(木) 01:17:12lipsデータを取る方法は解ったんですが、渡す方法が解らないです。
0045デフォルトの名無しさん
2006/02/23(木) 14:30:13出来なかったりするのか?
004644
2006/02/23(木) 14:43:48そりゃそうかも知れないな。
VMの上で動作するんだから、そこでclassファイルを動的には生成
できないよな。
となると動的ORMapperとか作れないということか、残念。
ちなみにここ参考になる
ttp://jroller.com/page/berlinbrown
0047デフォルトの名無しさん
2006/02/24(金) 00:17:490048デフォルトの名無しさん
2006/02/26(日) 01:45:41これの仕様ってわかりますか?
0049デフォルトの名無しさん
2006/02/26(日) 01:49:140050デフォルトの名無しさん
2006/02/26(日) 02:59:50John McCarthyの論文に書いてあるやつのことかな。
car, cdr, cons, cond, lambda? 他に必要なものあるかな。
http://www-formal.stanford.edu/jmc/recursive.pdf
005150
2006/02/26(日) 03:20:45PostScriptファイルの中に書いてあるけど、
quote, atom, eq, car, cdr, cons, cond
だそうな。でもそれだけじゃ物足りなくて、
関数定義をするためにlabelとlambdaが必要だとのこと。
http://www.paulgraham.com/rootsoflisp.html
0052デフォルトの名無しさん
2006/02/26(日) 03:22:590053デフォルトの名無しさん
2006/02/26(日) 03:26:46quoteのかわりに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であり、理論上チューリングマシンと同等の能力を持つ。
0054デフォルトの名無しさん
2006/02/26(日) 03:33:32論文斜め読みした。5関数といくつかの天下りシンボル(NIL, T, LAMBDA, QUOTE)で
万能関数(要するにeval)がちゃんと定義できるよという感じか。
0055デフォルトの名無しさん
2006/02/28(火) 05:15:45lambdaは関数じゃないけど。
0056デフォルトの名無しさん
2006/02/28(火) 05:42:260057デフォルトの名無しさん
2006/03/02(木) 04:04:59Emacsを使っていたのでいっちょ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というエラーが出るのですが、
こちらもお分かりになる方がいましたら合わせて教えていただけたらと思います。
お願いします。
0058デフォルトの名無しさん
2006/03/02(木) 04:07:10>実行してくれるのでしょうかが分からず困っています。(誤)
実行してくれるのかが分からず困っています。(正)
0059デフォルトの名無しさん
2006/03/02(木) 07:05:06> (load "test.lisp")
かね.clisp のエラーは,たぶん使ってる環境の文字コード設定が
clisp に理解できてない.iconv がリンクされてないか,環境の設定が
おかしいか.とりあえず clisp -Eforeign 1:1 とでもすればいくない?
clisp -Eforeign ascii test.lisp でもいいかも
006057
2006/03/02(木) 22:42:31レスありがとうございます。
>(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等とは全く違う感じですね。
こんな初心者ですがこれからもよろしくです。
0061デフォルトの名無しさん
2006/03/02(木) 23:45:24なりするでしょ?表示っつー機能が必要.
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 も使えてるよ.
006257
2006/03/03(金) 00:23:16;; 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 でも計算結果を表示しようと思ったら
なるほど。確かにそうですね...
0063デフォルトの名無しさん
2006/03/03(金) 01:02:04入ってるね.ASDF が入ってるところをみると,誰かが設定済みなのかな.
WARNING: *FOREIGN-ENCODING*: reset to ASCII
これはエラーじゃなくて警告ね.FFI とか C とのやりとで使うエンコーディン
グが ASCII コンパチじゃないといっている.
clisp -Eforeign iso-8859-1
のような ASCII コンパチの encoding を指定すれば消えるんじゃないかな.もっ
と新しいバージョンだと clisp -Eforeign 1:1 とかいけるんだけど.
006457
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 を指定すれば消えるんじゃないかな
この辺キーワードにして調べてみます。
ありがとうです。
0065デフォルトの名無しさん
2006/03/03(金) 02:22:27接呼び出す機能 (Foreign-Function Interface)」で使うエンコーディングを指
定しますが,通常ここはバイト列として扱いたい ( C のライブラリでは画像
データなど文字以外も扱えるので)なんで日本語のエンコーディング指定しちゃ
ダメです.バイト列として扱うために,あえて
clisp -Eforeign iso-8859-1
のように指定します.端末やファイルのエンコーディングの指定とは別の指定
なので,このように指定したかといって日本語が使えなくなるとかそーゆう事
はありません.むしろ,ここで euc-jp を指定しているから WARNING が出てい
るんです.上記のように iso-8859-1 を指定すれば治ると思いますよ.
0066デフォルトの名無しさん
2006/03/03(金) 02:48:58国際化されたライブラリを呼び出す場合、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.
006757
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して持ってきたら良いのかな?
とちその辺も含めて色々とやってみます。
どうもありがとう。
0068デフォルトの名無しさん
2006/03/18(土) 22:55:36> MSN サーチで "CLISP Win32 日本語" って検索したら libiconv を
> リンクした Windows 用の CLISP バイナリみつけた。
> http://lispuser.net/commonlisp/clisp.html
0069デフォルトの名無しさん
2006/03/18(土) 23:18:02CLISP最強伝説の幕開けか?
0070デフォルトの名無しさん
2006/03/18(土) 23:26:56バランスの良い処理系だと思う。インタプリタの速度なら結構良い勝負するし。
0071デフォルトの名無しさん
2006/03/18(土) 23:41:31もちつけ。CLISP じゃ伝説はむりだろ。まぁ起動時にエンコーディングまわり
の警告がでないという点は初心者向けには良いのではないだろうか。
0072デフォルトの名無しさん
2006/04/07(金) 11:06:48下のようなコードはLISPだと根本的に書き方がちがくなるのか?
{
FileOpenDialog fdlg=new FileOpenDialog();
RESULT res=fdlg.DoOpen();
if(res==OK){
Files files=fdlg.SelectedFiles;
FileSystem.CopyFiles(files);
}
}
神様よろ。
0073デフォルトの名無しさん
2006/04/07(金) 11:07:29{
FileOpenDialog fdlg=new FileOpenDialog();
RESULT res=fdlg.DoOpen();
if(res==OK){
Files files=fdlg.SelectedFiles;
FileSystem.CopyFiles(files);
}
}
0074デフォルトの名無しさん
2006/04/07(金) 14:50:010075デフォルトの名無しさん
2006/04/07(金) 22:06:08括弧の位置が変わるくらいじゃないかな?
慣れればその違いも気にならなくなると思うよ。
基本的には
object.method(arg);
ってのが
(method object arg)
になるって感じ。
0076デフォルトの名無しさん
2006/04/07(金) 22:50:12(with-file-open-dialog (files) (file-system-copy-files files))
とか
0077デフォルトの名無しさん
2006/04/12(水) 23:36:460078デフォルトの名無しさん
2006/04/12(水) 23:49:48サクラインターネットとか?
使えるつーか、コンパイル環境あるからgaucheとか入れれるよ
0080デフォルトの名無しさん
2006/04/15(土) 00:52:120081デフォルトの名無しさん
2006/04/17(月) 02:09:22最近,SchemeでSchemeのコンパイラを作ってみたいなと思っています。具体的にはSchemeのコードをネイティブなマシンコードへコンパイルしてみたいと考えています。そのためにはどのような本を読めばいいのでしょうか?
0082デフォルトの名無しさん
2006/04/17(月) 02:16:18君の知識、得意分野、アイデアをもうちょっと晒してもらわんとなんともはや。
少なくとも「サルでも作れるSchemeコンパイラ」のような本は無いと思う。w
0083デフォルトの名無しさん
2006/04/17(月) 02:37:58すみませんでした。
処理系はGaucheを使っていて日常の雑務を行うプログラムを組んだりライブラリを使ったりできます。また継続やマクロを使ってプログラムを組めます。BNFで書かれた仕様も読んだり書いたりできます。
わからないのは,どうやって読み込んだS式を効率良い形に変換し,マシンコードへ変換するかというところと,アセンブラです。アセンブラはCASLでやっただけです。
0084デフォルトの名無しさん
2006/04/17(月) 03:37:48これは俺も知りたい。多分、論文嫁って事になると思うけど。
ま、最初は↓こんなところを見ながら当りを付けて行くのが
良いかと。
http://www.federated.com/~jim/schintro-v14/schintro_toc.html
http://www.is.s.u-tokyo.ac.jp/~vu/97/jugyo/processor/compilerresume/
アセンブラは gcc が吐いたのを読むのが王道かと。
教材は、x86 なら↓これがお勧め。
http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=4-274-13207-2
Scheme で ASM なら↓こんなのがある。これも x86 だね。
http://home.earthlink.net/~krautj/sassy/sassy.html
あと、ここは Common Lisp スレだから、Scheme な話題なら
↓こっちに行った方が良いと思うよ。
Common Lisp, Scheme Part 14
http://pc8.2ch.net/test/read.cgi/tech/1132275726/
0085デフォルトの名無しさん
2006/04/17(月) 03:41:02コンパイラ作りたい初心者に向いてる言語じゃない様な気がする。
0086デフォルトの名無しさん
2006/04/17(月) 09:04:410087デフォルトの名無しさん
2006/04/17(月) 11:43:01ありがとうございます!
さっそく読んでみます。
0088デフォルトの名無しさん
2006/04/17(月) 23:11:42http://www.is.s.u-tokyo.ac.jp/~vu/97/jugyo/processor/compilerresume/
0089デフォルトの名無しさん
2006/04/17(月) 23:36:17既存のコンパイラのソース読むのが一番速いし。
ttp://www.score.is.tsukuba.ac.jp/~minamide/compiler-jikken/index.html
ttp://www.ie.u-ryukyu.ac.jp/~kono/lecture/compiler/index.html
0090デフォルトの名無しさん
2006/04/18(火) 22:21:550091デフォルトの名無しさん
2006/04/23(日) 02:47:470092デフォルトの名無しさん
2006/04/23(日) 02:59:14というのは冗談としても、わざわざインクリメンタル GC を実装している
処理系自体少なそうだね。
0093デフォルトの名無しさん
2006/04/23(日) 20:08:52tricolor schemeをそのままコードにしたようなものでわかりやすい
と思った。いわゆるlightweight系な言語だったのは覚えてるんだが
どの言語だったかはっきり覚えてない。すまん。
0094デフォルトの名無しさん
2006/04/30(日) 22:05:55SBCL-0.9.12にWINDOWSのバイナリーがあったので
落としてきたのだけど、インストールマニュアルを見ても
起動しない・・・
sbcl-0.9.12-x86-win32\src\runtime にパスを通して
SBCL --core sbcl.core で起動しても当然coreが見つからんし
英語読解力不足を棚に上げて悪いけど助けて!
0095デフォルトの名無しさん
2006/05/01(月) 00:38:44src\runtime\sbcl.exe --core output\sbcl.core
で起動するよ。
Windows で SLIME 使いたいならちょっと前にでてた
http://lispuser.net/commonlisp/clisp.html
が一番てっとりばやいと思われ。SBCL on Win32 はまだ罠大杉・・・
0096デフォルトの名無しさん
2006/05/01(月) 07:54:360097& ◆D3ra0B2LiQ
2006/05/01(月) 08:44:53ありがとう動いたよ!
SBCL ON Win32がまだまだなのはわかってるんだけど
あの爆速を体験すると触りたくなるのよね。
WinでLisp & Schemeとなると選択肢減るし、
普段が Petite Chez だからスピードに憧れるのよね。
0098デフォルトの名無しさん
2006/05/04(木) 04:49:34SBCL のスレッド回りも急激に進展してるようで、非常に wktk.
0099デフォルトの名無しさん
2006/05/06(土) 16:24:41lispってCommon LispとかSchemeとかいろいろあるみたいですが、
何が違うのでしょうか?
0100デフォルトの名無しさん
2006/05/06(土) 16:50:310101デフォルトの名無しさん
2006/05/06(土) 17:32:27C と C++ みたいな違い。
0102デフォルトの名無しさん
2006/05/06(土) 17:40:010103デフォルトの名無しさん
2006/05/07(日) 02:03:35Lisp (1950年代) 誕生 -> MacLisp, InterLisp とかイロイロ乱立 -> ベンダーが集って Common Lisp で規格化 (1984)
商用ベンダが集まっただけあってコンパイラを意識した規格になっている。ロー
ド,リード,コンパイル,評価時などを意識しているし,型システムについて
も決まってる。パッケージやオブジェクトシステム,デバッガやプロファイラ
なども規格に入ってる。
で,それとは別の流れとして 1970 年代に高名な Lisper が提唱して大学とか
情報科学の分野で進化してきたのが Scheme。こっちはミニマリスト的な考えに
基づいている。そんかわりコンパイラやパッケージ,型の取り扱い,オブジェ
クトシステムなどが規格に入ってない。末尾再帰の最適化や継続など Common
Lisp には無い機能が入ってたりする。
0104デフォルトの名無しさん
2006/05/09(火) 09:48:27Clisp でグラフィックとかGUIやりたいんですけど
何をどうすればいいのでしょうか。
GNUPLOTに書かせるのはとあるサイトにあったので
それはやってみました。
0105デフォルトの名無しさん
2006/05/09(火) 17:54:54Swingでguiプログラムを書く。
次にそのプログラムを書くlispプログラムを書く。
マクロ使いまくってコードの長さを半分以下にする。
0106デフォルトの名無しさん
2006/05/10(水) 00:55:09http://lispuser.net/memo/lisp/2006-02-25-23-57.html
OpenGL とか使いたいたいとかだとあんま C とかわんないなぁ…むしろ C の知
識が必要になる。
0107デフォルトの名無しさん
2006/05/11(木) 03:42:22LTKを使うのがわりとやりたかったことっぽいようです。
ありがとうございました。
0108デフォルトの名無しさん
2006/06/12(月) 18:07:45ラムダっちゃ
0109デフォルトの名無しさん
2006/06/13(火) 00:35:060110デフォルトの名無しさん
2006/06/19(月) 21:24:34ラ無駄無駄無駄無駄無駄無駄無駄無駄ァーーー!
0111デフォルトの名無しさん
2006/06/27(火) 07:07:57例えば、fac という関数を定義されていたとして、
(show-definition #'fac)
とすると、
引数 n と、
定義 (if (= n 1) 1 (* n (fac (1- n))) 等が
帰ってくる、show-definition みたいなものを探しています。
0112デフォルトの名無しさん
2006/06/27(火) 07:12:00元の列から一致した要素以降の列を返す関数はないですか?
0113デフォルトの名無しさん
2006/06/27(火) 08:56:04member?
0114デフォルトの名無しさん
2006/06/27(火) 11:39:45function-lambda-expression
0115デフォルトの名無しさん
2006/06/29(木) 05:29:35関数の定義を受け取って、
ある種の構文解析をするツールを作ってたのですが、
(parse-function '(defun fac (n) ...))
ってするのはあまりに面倒なので、
(parse-function #'fac)
と、したかったのでした。
0116デフォルトの名無しさん
2006/06/29(木) 05:38:24周囲に LISP を使う人がいないので簡単な事もなかなか分かりません。
>>115 で出力する際に構文要素がだぶって出力されるのを抑えるために Unix の uniq -d コマンドと同等の関数が欲しかったのですが、
copy-tree のアルゴリズムを応用して作成しました。その際に
(member item list :test (complement pred))
みたいな関数があるとすぐに書けるな〜。って思った訳です。
ちなみに、 uniq -d みたいな関数もしくはそれを実現出来る関数はありますか?
0117デフォルトの名無しさん
2006/07/01(土) 01:13:26「Lispと言えば今でも現場で画像処理なんかに使われている。」
って言葉がひっかかっています。
Lisp = 型宣言が不要でリスト処理が簡単にできる、
っていう程度の理解しかないからかも知れないのですが、
「リスト処理が得意 => 画像処理が得意」という短絡な答えではないですよね?
Lispと画像処理を結びつけた解説や記事はありませんか?
0118デフォルトの名無しさん
2006/07/01(土) 01:24:290119デフォルトの名無しさん
2006/07/01(土) 02:36:56こちら辺りで如何? 微妙に古いけれど。
http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Lisp%3aGeometry
http://www.gamasutra.com/features/19991112/GavinWhite_03.htm
0120デフォルトの名無しさん
2006/07/08(土) 19:30:48お勧めの本とかありますか?
あとLispのメーリングリストってないんでしょうか?
探しても見当たらないんですが...
0121デフォルトの名無しさん
2006/07/08(土) 21:30:040122デフォルトの名無しさん
2006/07/10(月) 21:15:26とりあえず Planet Lisp と shiro さんとこは読んでます。
0123デフォルトの名無しさん
2006/07/10(月) 21:23:440124デフォルトの名無しさん
2006/07/12(水) 04:56:06さんくす。とりあえず comp.lang.lisp 読んでみるわ。
あと、deliciasとかはてブのlispタグあたりから面白そうなものを
書いているとこ探してみます。
0125デフォルトの名無しさん
2006/07/12(水) 10:51:190126デフォルトの名無しさん
2006/07/16(日) 08:05:500127デフォルトの名無しさん
2006/07/16(日) 09:36:40こういうこと?
(format t "\"")
0128デフォルトの名無しさん
2006/07/16(日) 11:34:510129デフォルトの名無しさん
2006/07/28(金) 03:17:57例えば、+ を計算しつつ演算が全計算中で何回行われたか等を
my_add みたいな関数を定義する事なしにカウントしたいのですが、
どうすればいいのでしょうか?
0130デフォルトの名無しさん
2006/07/28(金) 22:50:070131デフォルトの名無しさん
2006/07/29(土) 19:20:48再定義じゃなくてオーバーロード
0132デフォルトの名無しさん
2006/07/29(土) 19:40:44(let ((old #'+))
(defun + (&rest numbers)
(message (format nil "~S" numbers))
(apply old numbers))
)
0133デフォルトの名無しさん
2006/07/30(日) 03:20:54まともな処理系で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の意見をもっと詳しく聞きたい。
0134131
2006/07/30(日) 11:19:05俺はSchemeの人なのでCommonLispはさっぱりわからん。
(Schemeもそれほど使いこなせてないけど。)
通りすがりに>>130の回答が的外れに思えたので言ってみただけ。
0135デフォルトの名無しさん
2006/07/31(月) 22:30:490136デフォルトの名無しさん
2006/08/13(日) 01:15:32λ...
λ...
0137デフォルトの名無しさん
2006/08/18(金) 09:46:52機能がつくらしいが、lispを動かすことはできるのだろうか??
0138デフォルトの名無しさん
2006/08/18(金) 11:06:490139デフォルトの名無しさん
2006/08/18(金) 23:54:410140デフォルトの名無しさん
2006/08/19(土) 02:58:47アレ重すぎる。面白そうだから少し使ってみたけど
weblogicと同じくらいメモリを消費するってのがちょっと・・・
0141デフォルトの名無しさん
2006/08/19(土) 11:59:48JVM で動作するスクリプトと比較してどうなの?まぁ、大抵のスクリプト言語
はインタプリタだろうからその分は差し引かないといけなさそうだけど
0142デフォルトの名無しさん
2006/08/20(日) 00:37:54もしlispが動く処理系がJVMに組み込まれたとして、何が出来るだろう?
ぱっと思いつくところとしてオブジェクト全部javaで切って置いて、
外部ファイルにlispでアプリの動作を定義するというDIみたいなものだろうか。
rhinoみたいにjavaで書かれていてなおかつ手軽にlispで遊べるtoolないもんかな〜〜
0143デフォルトの名無しさん
2006/08/20(日) 22:34:47ABCL を動かしてみた。起動時のメモリ使用量は
Rhino: 10MB
ABCL : 20MB
だった。重すぎるかねぇ?
0144デフォルトの名無しさん
2006/08/20(日) 22:35:55今どき目くじらを立てるほどではないと思う
0145デフォルトの名無しさん
2006/09/20(水) 18:27:21(1 2 3)などと入力した場合エラーになるのに
(defun hoge (p) p)という関数を定義して
(hoge (list 1 2 3))などとした場合エラーにならないのはなぜなんでしょうか?
関数の本体が実行される前に引数が評価されてp イコール (1 2 3)になるのなら
エラーになると思うんですが・・
0146デフォルトの名無しさん
2006/09/20(水) 18:50:03(1 2 3) と (list 1 2 3) は違う。後者を評価したものが前者になる。
言い方を変えると前者はデータ、後者はプログラム(=評価される式)。
プログラムを書くべき場所にデータを書けば当然プログラムとして評価される。
つまり 1 という関数を呼び出してエラーになる。
0147145
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)が評価されるならやはりエラー になるはずなのにならないのがまだ理解できないです。
0148デフォルトの名無しさん
2006/09/20(水) 19:48:27(1 2 3) が評価されるわけじゃなくて p が (1 2 3) にバインドされている状態で p が評価
される。その結果の値は (1 2 3) になる。
0149145
2006/09/20(水) 19:54:07(1 2 3)がある部分をpが指し示すようにするってことなんですね。
やっとわかりました。ありがとうございます。
0150デフォルトの名無しさん
2006/09/21(木) 02:02:39(list 1 2 3) => "list" 関数として評価 => リストオブジェクト
'(1 2 3) == (quote (1 2 3)) => (1 2 3) を評価せずそのままオブジェクトとして返す => リストオブジェクト
0151デフォルトの名無しさん
2006/09/22(金) 05:46:30| 言い方を変えると前者はデータ、後者はプログラム(=評価される式)。
は変に感じるな。両方ともデータだし、同時にプログラムでもある。
ただ前者は「正しくない」プログラムだけど。>>150 の表記は気持ち悪いねぇ…
オレだけか(w
0152デフォルトの名無しさん
2006/09/22(金) 12:27:10揚げ足取りと言われたくないなら、>>145レベルの人のために君の的確な説明を書き込もう
0153デフォルトの名無しさん
2006/09/22(金) 22:08:54(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のかた、この程度ですんません。
0154デフォルトの名無しさん
2006/09/22(金) 22:22:50(class-of '1a)
(class-of '1e)
(class-of '1e1)
なんてのも面白いぞ。
要するに数値として解釈できるものは数値になる。
0155デフォルトの名無しさん
2006/09/23(土) 00:53:39マクロの所でどうしてもわからないところがあります。
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で試してみたらスタックフローオーバーになりました
0156デフォルトの名無しさん
2006/09/23(土) 00:59:18expand-condの定義でmycondを使うのはまずいな。
condを使うか、ifか何かで書き換えるかするよろし。
0157デフォルトの名無しさん
2006/09/23(土) 01:00:34(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 )) ))))
0158デフォルトの名無しさん
2006/09/23(土) 01:12:28>>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 )) ))))
0159デフォルトの名無しさん
2006/09/23(土) 01:19:53yes
0160158
2006/09/23(土) 01:25:09うーん・・本に書いてある例↓だと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 )) ))))
0161デフォルトの名無しさん
2006/09/23(土) 01:56:19「初めての人のためのLISP」、書庫から探してきた。162ページだよね。
えっと、condのような特殊形式はマクロで再定義してはならないことになっているんですわ。
だから竹内本の例はCommon Lispとしてはcondをマクロとして定義している時点で正しくない
ということになる。(本の中のプログラムは正確な例ではなく概念的な説明なのだと思う)
0162158
2006/09/23(土) 02:33:22condの再定義自体してはいけないということなんですね
仮にmycondを定義するとしたら例のどこを修正したら良いのでしょうか?
ループになってる部分をなんとかしたら自分にも理解できそうになると思うのですが・・
0163デフォルトの名無しさん
2006/09/23(土) 08:38:05expand-condの中でmycondを使わない。ifで書けばよい。
expand-condが返す式の中では使ってもよい。
(ただし、その中でmycondに渡す引数が元のclausesより短くならないといけない)
0165デフォルトの名無しさん
2006/09/24(日) 04:49:11#'と'の違いは何なんでしょうか?
applyに渡すときは'#+でも'+でも大丈夫なのに
(setf (symbol-function 'hoge)
#'(lambda (x) (+ x 2)))が大丈夫で
(setf (symbol-function 'hoge)
'(lambda (x) (+ x 2)))がエラーになるのは何故なんでしょうか?
0166デフォルトの名無しさん
2006/09/24(日) 06:48:56クロージャをつくるときは #' ということでヨロシク。
0167デフォルトの名無しさん
2006/09/24(日) 07:31:00http://www.lispworks.com/documentation/HyperSpec/Body/26_glo_f.htm#function_designator
例えば、
(defun foo () (print "grobal function"))
(let ((foo #'(lambda () (print "local variable"))))
(flet ((foo () (print "local function")))
(funcall foo)
(funcall 'foo)
(funcall #'foo)))
とすると、
"local variable"
"grobal function"
"local function"
となります。
0168デフォルトの名無しさん
2006/09/24(日) 12:09:220169165
2006/09/24(日) 16:19:50そもそもapplyにシンボルで渡している場合でも
apply本体の中での第一引数が指してる物は関数の実体ではなくて
関数の名前ですよね
関数の名前を指してる変数しか持っていないのにどうやって関数を指すことが
できるようになるんでしょうか?
つまり
(setq a 'b)
(setq b 'c)
でaしか持ってない時にaを何回評価してもbにしかなりませんよね。
(つまりapplyの場合関数の名前しか手に入らない)
それでb、要は関数の名前を評価してc、つまり関数の実体を得る事をapplyはどうやって
行ってるんでしょうか?
0170デフォルトの名無しさん
2006/09/24(日) 16:27:47シンボルにはその関数定義を入れる箱が付属している。
その箱の場所を取り出すのが symbol-function なのだ。
0171165
2006/09/24(日) 17:15:05つまり大雑把に言うとapplyの中ではまず第一引数が指してるのが
'lambdaか#'lambdaチェックして
'lambdaだったらapplyのなかでさらに(apply (symbol-function 第一引数) '(第二引数))
を呼び出して#'lambdaだったら(apply 第一引数 '(第二引数))を呼び出すという
イメージでいいんでしょうか?
細かいことにこだわる自分にとって独学でLISP勉強するのはきついよ(つД`)
0172デフォルトの名無しさん
2006/09/24(日) 17:20:19http://www.lispworks.com/documentation/HyperSpec/Body/f_apply.htm#apply
> Syntax:
> apply function &rest args+ => result*
> Arguments and Values:
> function---a function designator.
http://www.lispworks.com/documentation/HyperSpec/Body/26_glo_f.htm#function_designator
> function designator: n.
> a designator for a function; that is, an object that denotes a
> function and that is one of: a symbol (denoting the function named by
> that symbol in the global environment), or a function (denoting
> itself).
0173デフォルトの名無しさん
2006/09/24(日) 17:30:23まぁそんな感じ
0174デフォルトの名無しさん
2006/09/25(月) 00:16:04むしろ向いてる気がするんだけどね。「定義?仕様?実装を見ろッ」という
のは楽なんだけど,時々自分が悪いのかそれとも地雷踏んだのか悩むし
function designator:
1. シンボル ;; グローバル環境で関数名を表わすシンボル
2. 関数 ;; #'foo とか (lambda (...) ...)
と定義されているのでー手元の SLIME で試すとこんな感じ
CL-USER> (defun フゥゥ () 'グローバルフゥゥ)
フゥゥ
CL-USER> (flet ((フゥゥ () 'ローカルフゥゥ)) (apply 'フゥゥ ()))
グローバルフゥゥ
CL-USER> (flet ((フゥゥ () 'ローカルフゥゥ)) (apply #'フゥゥ ()))
ローカルフゥゥ
0175デフォルトの名無しさん
2006/09/25(月) 17:38:39あと日本語の情報がすくないのも英語が苦手な自分にとってはきついっす
fletの意味が竹内先生の本にもポールグレアムの本にも載ってなかったので
flet Lispとかで検索してみたんですが英語のページばっかりでdefunとの違いがよくわからないorz
0176デフォルトの名無しさん
2006/09/25(月) 17:47:33日本語のきちんとした説明が欲しいなら CLtL2 日本語版は買う価値があると思う
0177デフォルトの名無しさん
2006/09/25(月) 17:49:11(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内部の局所関数なためエラーになる。
0178デフォルトの名無しさん
2006/09/25(月) 17:52:54flet では定義した局所関数は同じ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
0179175
2006/09/25(月) 18:04:35関数内で関数を定義できるということはlambdaとほとんど同じ意味で
名前をつけるので自分で自分を呼び出せる(再帰できる)というのが
lambdaと異なるという考えでいいんでしょうか?
0180デフォルトの名無しさん
2006/09/25(月) 18:42:29lambda関数に比べてfletとかで定義した関数が便利なのは、
funcallを付けずに呼び出せるとこ。
0181デフォルトの名無しさん
2006/09/25(月) 20:21:46に含まれるかどうか
>>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
0182デフォルトの名無しさん
2006/09/25(月) 22:55:030183デフォルトの名無しさん
2006/09/26(火) 04:30:00funcall や apply にシンボルを渡せる、てのも便利な場面はなくはないだろうけれど。
scheme の方が初心者がはまりそうな穴は少ないかもしれんね。
>>181
気持ちはわかるが入門スレでそこまでつっこむのは如何なものか。
0184デフォルトの名無しさん
2006/09/26(火) 07:01:44個人的には、細かい事が気になったら書き出しておいて、言語に慣れた後で調べた方がいいと思うけど。
今知るべき事とそうではない事を切り分けて、かつ分からない事を記録して行けば、
再起出来る出来ないなんていう理解の仕方ではなく、
>>局所関数の定義の lexical environmentに含まれるかどうか
というより本質的な理解を自力で出来るようになるはず。
0185デフォルトの名無しさん
2006/09/26(火) 15:46:58単に関数やマクロの使い方の説明をするだけでなくて、竹内先生の本のような
動的変数や環境とか束縛等の根っこの方の説明や、簡単な処理系の作り方を説明してるような
本はないでしょうか?
やっぱりGuy L. Steele Jrのあの高い本買うしかないのかなorz
0186デフォルトの名無しさん
2006/09/26(火) 15:53:41そういう本とはちょっと違うけど、CLtL2は良いよ。
第1版の時代からだから20年前から読んでるが、久しぶりに開くと今でも新しい発見がある。
0187デフォルトの名無しさん
2006/09/27(水) 00:05:02普通再帰するときは↓のように labels つかうんだし
(labels ((myevenp (n)
(if (= n 0) t (myoddp (1- n))))
(myoddp (n)
(if (= n 0) nil (myevenp (1- n)))))
(myevenp 11))
0188デフォルトの名無しさん
2006/09/27(水) 00:13:38の Lisp も全部読めばイイ本だよ.GC を作る例題とかあっていかんじ.英語が
がんばれるなら原書のほうがオススメだけど.
リアルオススメは Norvig の PIAP だな.Scheme や Prolog のインタプリタ,
コンパイラが例題にでてくるよ.コードも数ページ程度の短かいので動くから
おもしろいし.学生時代に読んだんだけど当時 Lex とか Yacc とか聞いたこと
もないド素人だったけど辞書片手にちょこちょこ読んだだけで普通に簡単なコ
ンパイラが作れるようになった.
0189デフォルトの名無しさん
2006/09/27(水) 00:48:12s/PIAP/PAIP/
Norvigは教科書書かせたら神だよね。
0190185
2006/09/27(水) 06:11:13PAIP面白そうですが一万円・・・うーん
0191デフォルトの名無しさん
2006/09/27(水) 11:55:18>>186は日本語版の話。念のため。
0192デフォルトの名無しさん
2006/09/29(金) 09:55:430193デフォルトの名無しさん
2006/09/30(土) 14:40:59こないだインタビューで好きなものは Python と Lisp ってゆってたYOOO
0194デフォルトの名無しさん
2006/10/01(日) 16:31:17クロージャが関数が定義された時の環境を持ち運べるという考えなら
OOPのメンバ変数とどういう点が異なるんでしょうか?
ttp://www.geocities.jp/m_hiroi/xyzzy_lisp/abclisp11.html
このサイトのジェネレータの例をみると同じような考え方だと思うんですが
0195デフォルトの名無しさん
2006/10/01(日) 16:57:36レベル(レイヤ)の違う話なので、どういう点が異なるのかと言われても当惑する。
0196デフォルトの名無しさん
2006/10/01(日) 17:00:23まあクラスから「関数+隠蔽された変数」という概念だけを取り出したものだと思ってくれてもいいかも。
オブジェクト指向やってた人からするとなんか貧弱なものに見えるかもしれんけど
Lispの他の機能とあわせればそれだけで困らんの。
0197デフォルトの名無しさん
2006/10/01(日) 17:29:32関数を持っているデータ → クラス
こんな理解の仕方であってますか?
0198デフォルトの名無しさん
2006/10/01(日) 17:30:51そんな感じだね。(記号化して理解した気になるのは多少危険だけど)
0199デフォルトの名無しさん
2006/10/01(日) 18:49:52関数がクラスに属するかどうか、データ隠蔽を行うかどうかは言語ごと
(というかオブジェクトシステムごと) の違いだよねえ。
0200デフォルトの名無しさん
2006/10/02(月) 05:06:32適当な言語でクロージャそのものを勉強すればいいのに、
「クロージャとはどういうものか」しか理解しようとしないから
いつまでたってもわかんないんだと思うが。
0201デフォルトの名無しさん
2006/10/02(月) 06:00:57その辺わりとガッチリした実感が得られるんじゃないかな
0202デフォルトの名無しさん
2006/10/02(月) 13:27:15そんなものがない世界の頭のままでクロージャとは〜とか言ってても
あんまりよくわからないと思う。
って、また「環境って何ですか」とかやられてもかなわないんで
それはやっぱり、そういうのがある言語を勉強してねってことで。
0203デフォルトの名無しさん
2006/10/03(火) 20:34:16CHAPTER8でわからない箇所があったので意見を聞きたいのですが
0204デフォルトの名無しさん
2006/10/03(火) 20:44:56どうぞ
0205203
2006/10/03(火) 20:53:35(do-primes (p 0 19)
(format t "~d " p))
というマクロ呼び出しがあるんですが
どうして(0 19)ではなくて(p 0 19)なんでしょうか?
わざわざpなんていう変数をわたさなくても
doの先頭でpを宣言してそれを使えば良いと思うんですが・・・
0206デフォルトの名無しさん
2006/10/03(火) 22:13:500207デフォルトの名無しさん
2006/10/04(水) 02:56:19パッケージ関係でややこしいことになりかねないしね。
0208205
2006/10/04(水) 12:06:480209デフォルトの名無しさん
2006/10/06(金) 16:34:43カイ2乗が出てくる辺りから。
0210デフォルトの名無しさん
2006/10/09(月) 11:07:58Cなどだと実行ファイルを作成したら後はそれをクリックして実行するのが普通だと思うんですが
Lispの場合
処理系を起動させる→定義のロード→関数をタイピングして実行する
という流れが基本なんでしょうか?
0211デフォルトの名無しさん
2006/10/09(月) 12:09:13「クリックして実行」はウィンドウマネージャの機能だから、言語とは関係無いよ。
好きなようにやれば良い。
0212デフォルトの名無しさん
2006/10/09(月) 12:14:39はい。
タイプする代わりに処理系の引数で式を与えて評価させることもできるので
#!/bin/sh
sbcl --eval '(load "/path/to/hello.fasl")'
みたいなスクリプトなどを用意すれば独立した実行ファイルみたいに見えます。
多くの処理系では関数を実行する一歩手前の定義をロードした状態を
ファイルに保存し、次回その状態から起動することもできます。
sbcl --core my-program-defined.core --eval '(my-program:run)'
みたいに。
使ったことはありませんが、商用の Allegro Common Lisp とかだと
独立した実行ファイルを生成することもできるのではないでしょうか。
0213210
2006/10/09(月) 12:34:33212さんの挙げている上の例だとコンパイル済みのファイルをロードして評価する
というのを引数にしてsbcl実行時にあたえるということだと思うのですけれども
いろんなLispのプログラムを見てみたんですが一番最初に呼ばれる関数、
つまりCでいうmain関数のような物はどうやって定義するのでしょうか?
あとWinXP+clispで勉強をしているのですが文法の説明ではなく処理系自体の使い方を
説明した本やサイトなどはないでしょうか?
clispのマニュアルを読んでみたんですがイマイチよくわからないですorz
0214デフォルトの名無しさん
2006/10/09(月) 13:27:05main相当をやる方法は処理系依存も含めていろいろあるが、基本的にはトップレベルで
関数を呼び出せばそのまま実行されると思えばよい。
君の疑問に対する答えの多くはclispのマニュアルに書いてあるから、ちゃんと読むのが
良いだろう。
0215デフォルトの名無しさん
2006/10/09(月) 13:43:330216デフォルトの名無しさん
2006/10/09(月) 13:54:510217デフォルトの名無しさん
2006/10/09(月) 13:58:290218217
2006/10/09(月) 14:01:080219デフォルトの名無しさん
2006/10/09(月) 15:45:490220デフォルトの名無しさん
2006/10/09(月) 15:50:390221212
2006/10/09(月) 16:03:04lispってのは、基本的に書かれていることを頭から順に実行するだけです。
それは、対話的環境でもファイルでも同じ。
ファイルがコンパイルされていてもいなくても同じ。
loadは「ファイルを読み込んでそれを実行する準備」では《なく》、
「ファイルを開いて中身を順に実行する」という操作です。
少しぐぐってみましたが
http://cs.gmu.edu/~sean/lisp/LispTutorial.html
の Loading and Compiling Lisp の項などは多少参考になるかも知れません。
色々実験して体得してください。
0222デフォルトの名無しさん
2006/10/09(月) 17:24:37Lispをよく知らないプログラマ向けの教養本としてなら可。
情報系の学生にとってはゴミ。って感じでした。
0223デフォルトの名無しさん
2006/10/09(月) 17:29:20> lispってのは、基本的に書かれていることを頭から順に実行
Scheme等では必ずしもそうではない。
CommonLispスレだからCommonLispのことを指しているんだろうけど、
"lispってのは"という風に一般論にするのは好ましくないと思う。
0224デフォルトの名無しさん
2006/10/09(月) 17:33:10何を始めたらいいのかわからん
0226デフォルトの名無しさん
2006/10/09(月) 21:25:52「基本的に」と言ってるんだからScheme等にも当てはまると思うが
0227デフォルトの名無しさん
2006/10/09(月) 21:33:26直接はLispに関係ないけど。
http://practical-scheme.net/trans/mit-j.html
>>226
Lispの思想を考えると基本的に順番は規定されてないと考えるべきだと思う。
最も普及してるCommonLispで規定されてるけど、
Lispの中ではむしろ異端だろ。
0228デフォルトの名無しさん
2006/10/09(月) 21:44:11うーん。Lispの思想かなぁ。あまり賛成できない。
0229デフォルトの名無しさん
2006/10/09(月) 22:58:510230デフォルトの名無しさん
2006/10/09(月) 23:09:44マジレスすると emacs lisp、そして lisp としては最悪。
真面目に勉強するなら Common Lisp でいいんじゃねーの?
最近「practical common lisp」とか本も出てるし。
>>222
おれは非情報系だから、ラムダ計算のとこだけ面白かったよ。
0231デフォルトの名無しさん
2006/10/09(月) 23:12:49ttp://www.gigamonkeys.com/book/
これだ!!
0232デフォルトの名無しさん
2006/10/09(月) 23:31:090233デフォルトの名無しさん
2006/10/10(火) 00:24:39如何にしてforkしてexecするか、ってのが本質だと思ってるのはCUI環境で育ったジジィだけ?
lispに関係ないから下げとくね。
0234デフォルトの名無しさん
2006/10/10(火) 02:08:48(OSが違うとシステムコールの流儀は多少違うけど)
変わったのは人間様がどう接するかという部分だけ。
0235デフォルトの名無しさん
2006/10/10(火) 02:37:35マジレスすると、 SLIME とかの統合開発環境を使うのが Lisp では(少なくと
も Common Lisp では)一般的だ。エディタでかいて、ダブルクリックで実行し
て…というサイクルでも開発できるけど、たぶん面倒だと思う。
LispWorks みたいにエディタ、対話環境 (REPL)、その他ツールが一体になって
るのが普通。 Windows で CLISP だと Emacs + SLIME って手があるね。
ttp://lispuser.net/commonlisp/clisp.html
0236デフォルトの名無しさん
2006/10/10(火) 03:23:06Common Lispのほうがいいんですか?
0237デフォルトの名無しさん
2006/10/10(火) 03:40:09Schemeの方が好きだけどとにかく仕事を片付ける為に使うとか、ドロ臭い実戦投入には
Common Lispの方が向いてると思う。Gaucheくらいライブラリ充実してると話は別だけど。
デバッグ環境の強力さとかプロファイラの充実っぷりではまだCommon Lispの方が上だと思う。
ペチじゃないChezとか商用の強力そうなScheme使ったことない漏れの個人的見解なんで
猛者の反論を待つ。
>>236 は両方使ってみて気に入った方を使えばいいのでは。どっちも似たようなもんだし(って書くと怒られそうだけど)
0238デフォルトの名無しさん
2006/10/10(火) 03:57:240239デフォルトの名無しさん
2006/10/10(火) 05:53:190240デフォルトの名無しさん
2006/10/12(木) 02:30:41#'(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)
エラー
納得行かねー。
0241デフォルトの名無しさん
2006/10/12(木) 03:26:10入門レベルなので解説できないけど、↓のヒントにならない?
(funcall #'cons 1 2)
(funcall #'(lambda (x y) (cons x y)) 1 2)
(funcall (function cons) 1 2)
0242デフォルトの名無しさん
2006/10/12(木) 03:48:24>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 ...) ってマクロは余計なお世話だよなあとは思う。
0243デフォルトの名無しさん
2006/10/12(木) 04:06:02なんと。
> その時点で car 部にある (lambda ...) という式はマクロ展開されない。
ななんと。
> また、(#'foo ...) -> ((function foo) ...) であり、これは不正な式になる。
そうか。なるほどこれは確かに。
いや、((symbol-function 'cons) 1 2)も試したんですよ?
でもそれを認めると評価して関数になるものでよければ
変数でもいいじゃねーかということでschemeになっちゃうか……
0244デフォルトの名無しさん
2006/10/12(木) 06:16:52人は耳タコでしょう。それぞれメリット、デメリットがあるので「どっちが優
れている」という事はない。どっちが好みか、という事だね。
以下、ニュースグループからの抜粋。
例:
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
0245デフォルトの名無しさん
2006/10/12(木) 09:37:560246デフォルトの名無しさん
2006/10/12(木) 09:47:28fとかに。
0247デフォルトの名無しさん
2006/10/12(木) 10:15:370248デフォルトの名無しさん
2006/10/13(金) 00:29:53全くの初心者で申し訳ないのですが、何かよい参考書のようなものはないでしょうか。
0249デフォルトの名無しさん
2006/10/13(金) 00:45:460250デフォルトの名無しさん
2006/10/13(金) 19:34:530251デフォルトの名無しさん
2006/10/13(金) 19:36:090252デフォルトの名無しさん
2006/10/13(金) 19:36:480253デフォルトの名無しさん
2006/10/19(木) 23:38:33C言語と違ってたとえば
(defun fact(N)(cond ((equal n 0) 1)
(t (times N(fact (sub1 N)))))
だとIF文にあたるcondはどういう挙動になりますか?
0254デフォルトの名無しさん
2006/10/19(木) 23:55:150255デフォルトの名無しさん
2006/10/20(金) 00:35:44もういちど国語を勉強して、普通の論理読解力・記述力を身につけような。
この先の人生できっとペイするから。
0256デフォルトの名無しさん
2006/10/20(金) 12:55:17たぶんこの展開を「イジメられた」と解釈するだろう。
0257デフォルトの名無しさん
2006/10/20(金) 15:10:260258デフォルトの名無しさん
2006/10/21(土) 10:16:34よ。もうちょっと聞きたい事を詳しくゆってくれ。
がんばって推測してみた。
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 が無いとかそんな話だろうか。
0259デフォルトの名無しさん
2006/10/21(土) 13:10:53エスパーキター!
0260デフォルトの名無しさん
2006/10/22(日) 13:36:500261デフォルトの名無しさん
2006/10/22(日) 13:47:480262デフォルトの名無しさん
2006/10/22(日) 13:49:540263デフォルトの名無しさん
2006/10/25(水) 13:04:11非常に興味あるんですが、今までのライブラリも捨てがたす・・・(・ω・)
0264デフォルトの名無しさん
2006/10/25(水) 18:37:00これはちがうかな?
0265デフォルトの名無しさん
2006/10/26(木) 02:37:47過去スレに色々出てるから見られたら見てみるよろし。
0266デフォルトの名無しさん
2006/10/26(木) 07:22:56http://weitz.de/rdnzl/
ECL 方面では、これで使って構文ハイライトや補完といった
Windows 用の LISP Shell を製作中。
http://sourceforge.net/forum/forum.php?forum_id=609266
0267デフォルトの名無しさん
2006/10/30(月) 20:44:020268デフォルトの名無しさん
2006/10/30(月) 21:12:19部分を修正しdot.emacsに追加しています。
ところが読込で下記のエラーで前に進みません。
Symbol's function definition is void: pushnew
Takashi Hiromatsu さんのNTEmacs上で動かしています。
0269デフォルトの名無しさん
2006/10/30(月) 21:54:47http://user.ecc.u-tokyo.ac.jp/~t50473/onlispjhtml/ を一通り読んだのですが、
印刷されたものを手元に置いておきたいので。
もし関係者の方がこのスレを見ていたらおせーて下さい!
0270デフォルトの名無しさん
2006/10/31(火) 00:55:54pushnew の行の前で↓の行を足せば ok。
(require 'cl)
だれか中の人に報告よろしく。
0271デフォルトの名無しさん
2006/10/31(火) 08:43:53これで、「やさしいLISP入門」酒井皇治著の勉強が出来ます。
0272デフォルトの名無しさん
2006/10/31(火) 17:03:42普通に、「シーエムユーシーエル」ですかね?
0273デフォルトの名無しさん
2006/10/31(火) 17:10:260274デフォルトの名無しさん
2006/10/31(火) 17:20:480275デフォルトの名無しさん
2006/11/01(水) 01:11:440276デフォルトの名無しさん
2006/11/01(水) 01:26:18【実際には set の対象にできるのは大域変数だけ】
正確には (set s v) ≡ (setf (symbol-value s) v) と定義されている
0278デフォルトの名無しさん
2006/11/03(金) 02:16:120279デフォルトの名無しさん
2006/11/03(金) 09:02:36俺はプリンタで全部印刷して持ってる。
0280デフォルトの名無しさん
2006/11/03(金) 20:01:310281デフォルトの名無しさん
2006/11/03(金) 23:03:59章とかページが入るべきとこにvoxとかfooとか書いてあるんだけど、
ラベルの付け忘れみたいなもん?
0282flatline ◆r6EONKKhcc
2006/11/04(土) 00:07:10\label とかするのめんどくて.
0283デフォルトの名無しさん
2006/11/04(土) 00:13:260284デフォルトの名無しさん
2006/11/04(土) 00:14:26「2.9 コンパイル」の最後に「第foo章を参照」ってのがあるけど。
0285デフォルトの名無しさん
2006/11/04(土) 00:15:26古いけど、発展が止まってるわけでもないので、
現状に合わないってこたないよ。
0286デフォルトの名無しさん
2006/11/04(土) 00:15:33言語が古いと何か困ることがありますか?
0287flatline ◆r6EONKKhcc
2006/11/04(土) 01:07:02ありゃ,本当ですね.でも他には少ないはずです.
適宜 原文に当たって下さい.(そこで指しているのは7.9節のようですね)
>>283
C++やRubyにはない機能を標準搭載しているから.
すなわち処理系の動作をプログラミングできる「マクロ」.
0288デフォルトの名無しさん
2006/11/04(土) 13:44:24より巨大化してナウい言語に成長するんだ!
0289デフォルトの名無しさん
2006/11/04(土) 13:48:570290デフォルトの名無しさん
2006/11/04(土) 15:32:190291デフォルトの名無しさん
2006/11/04(土) 16:18:26他のLisp系スレの住人なら、半数くらいは自作の処理系持ってそうだな。
勿論、公開に耐えるほど作り込んでいる人は一部だろうけど。
0292デフォルトの名無しさん
2006/11/04(土) 17:30:450293デフォルトの名無しさん
2006/11/04(土) 17:49:130294デフォルトの名無しさん
2006/11/04(土) 17:57:55私はxyzzyに内臓してるやつです。
0295デフォルトの名無しさん
2006/11/04(土) 18:05:370296デフォルトの名無しさん
2006/11/04(土) 18:05:50それは(このスレ的には)偽物だぁああああああ
CLISP とか GCL とか CMUCL とか SBCL とかフリーの本物はいくらでもあるぞおおおおおお
0297デフォルトの名無しさん
2006/11/04(土) 19:15:51え、xyzzyは偽物なの?
CommonLispじゃないの?
ずっと使ってたよ。
0298デフォルトの名無しさん
2006/11/04(土) 19:40:34偽者っていうと語弊があるかもしんないけど、
規格を半分も満たしてないみたいだよ。
0299デフォルトの名無しさん
2006/11/04(土) 20:38:12方言の一種というか。
0300デフォルトの名無しさん
2006/11/04(土) 20:51:18まあ似たような系である Emacs Lisp と比べれば
はるかに Common Lisp に近いと思うけどね。
0301デフォルトの名無しさん
2006/11/04(土) 22:00:000302デフォルトの名無しさん
2006/11/04(土) 23:20:570303デフォルトの名無しさん
2006/11/05(日) 04:04:34俺はそうは思わんな。初心者こそちゃんとした処理系で勉強しないと本を読んだりしたときに
混乱するだろう。xyzzyで勉強するのは自由だが、あれをCommon Lispだと思ってここで質問
したりするのはやめてほしい。
本物の蟹が無料で食べられるのに、わざわざ蟹カマを食べる必要はないと思う。
0304デフォルトの名無しさん
2006/11/05(日) 04:33:55ttp://www.geocities.jp/m_hiroi/xyzzy_lisp.html
食の本場フランスでは蟹カマボコが人気らしい(マジ
0305デフォルトの名無しさん
2006/11/05(日) 09:10:15けっこうとんでもない作業で Common Lisp の実用性を示す良い例だ。
でも 開発環境としては現状 Emacs + SLIME や LispWorks Personal の
ほうが充実してると思う。 SLIME の移植もしたいけど、なかなか時間がとれないなぁ。
0306デフォルトの名無しさん
2006/11/05(日) 13:13:27Common Lispでないのだからxyzzyはスレ違いだと思う。
少なくともCommon Lispの勉強にはCommon Lispのほうが適すると思う。
0307デフォルトの名無しさん
2006/11/05(日) 13:43:580308デフォルトの名無しさん
2006/11/05(日) 14:19:31みんなは?
0309デフォルトの名無しさん
2006/11/05(日) 15:16:45SBCLとCLISPは、Lispboxに入ってるやつ。
主にSBCLですが、slime-autodoc-modeの表示がCLISPよりわかりやすいので。
0310デフォルトの名無しさん
2006/11/05(日) 17:07:39誰か教えてください。
0311デフォルトの名無しさん
2006/11/05(日) 19:07:100312デフォルトの名無しさん
2006/11/05(日) 19:31:570313デフォルトの名無しさん
2006/11/05(日) 21:45:57GrahamのANSI Common Lispくらいじゃない?
PCLはどうなんだろう。俺は3/4くらいは読んだけれども。
0314デフォルトの名無しさん
2006/11/06(月) 00:34:28内容についても簡単に説明するのが礼儀というものだろう
0315デフォルトの名無しさん
2006/11/06(月) 01:45:450316デフォルトの名無しさん
2006/11/06(月) 04:08:310317デフォルトの名無しさん
2006/11/06(月) 17:40:540318デフォルトの名無しさん
2006/11/06(月) 20:03:250319デフォルトの名無しさん
2006/11/06(月) 23:21:000320デフォルトの名無しさん
2006/11/07(火) 02:16:020321デフォルトの名無しさん
2006/11/07(火) 02:46:270322デフォルトの名無しさん
2006/11/07(火) 08:18:32Mock Turtleみたいなもんだ。
0323デフォルトの名無しさん
2006/11/11(土) 00:31:12http://journal.mycom.co.jp/articles/2006/11/09/cusp/
0324デフォルトの名無しさん
2006/11/11(土) 18:27:150325デフォルトの名無しさん
2006/11/11(土) 18:53:500326デフォルトの名無しさん
2006/11/12(日) 02:20:42こ、これはカスプと呼んで差し支えないのでせうか・・・
0327デフォルトの名無しさん
2006/11/14(火) 02:23:01例えば、123 456 78
と入力されると、
78 456 123
と表示されるようなのです。
0328デフォルトの名無しさん
2006/11/14(火) 03:09:321. ファイルを開く
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)))))
宿題なら「今迄習った関数」「授業の教科書」くらい教えてくれんと、
範囲外の機能を使ってしまってパクリがバレバレになるかもしれんよ。
0329デフォルトの名無しさん
2006/11/17(金) 03:11:34hyperspecとかをみているの?
なにが標準なのかよくわからなくての質問なんだけど
0330デフォルトの名無しさん
2006/11/17(金) 11:24:050331デフォルトの名無しさん
2006/11/17(金) 21:21:47CLtL2 はその一個前。こいつは CLOS とかがないとかちょっと違うけど、
まぁ基本的なとこはほとんど同じ。
商用のコンパイラにはマニュアル一式がついてくる(HyperSpec を含んでる)
のでそれを見てる。
http://www.lispworks.com/documentation/
http://www.franz.com/support/documentation/
フリーの処理系は、だいたい HyperSpec が基本で、その追加や拡張分だけ
載ってるってケースが多いね。
0332デフォルトの名無しさん
2006/11/17(金) 22:21:02CLOSが無いのはCLtL初版。CLtL2はCLOSは入ってるよ。
ANSIとCLtL2の差分はさほど多くない。(例えば lambda マクロ)
0333デフォルトの名無しさん
2006/11/23(木) 02:36:460334デフォルトの名無しさん
2006/11/23(木) 03:07:520335デフォルトの名無しさん
2006/11/23(木) 04:30:36フリーなら CLISP か SBCL くらいに収束してきてるんじゃないかな。
0336デフォルトの名無しさん
2006/11/23(木) 05:10:370337デフォルトの名無しさん
2006/11/23(木) 09:46:470338デフォルトの名無しさん
2006/11/23(木) 12:59:420339デフォルトの名無しさん
2006/11/26(日) 13:33:20でも現実は開発者が集まらないからか、全然もりあがってる風がないな
0340デフォルトの名無しさん
2006/11/26(日) 14:49:25SBCL、 Maxima、 SLIME あたりは結構活発だよ。おっかけるだけでも結構大変だもん。
SLIME とか Edi Weitz がネットニュースに投稿した SLIM がベースにボランティアが発展させた
典型的なオープンソースプロジェクトだと思うけど。
0341デフォルトの名無しさん
2006/11/26(日) 15:17:40lispを訴える最後のチャンスです!!
0342デフォルトの名無しさん
2006/11/26(日) 15:22:26そのチャンスとやらは Scheme に任せる方向で。
0343デフォルトの名無しさん
2006/11/26(日) 15:52:23いや、それらをlisper以外が使うかね?
Rails 見ろ。正直すごいとは思わないけど、注目をあつめてruby人気を牽引してる。
0344デフォルトの名無しさん
2006/11/26(日) 16:29:15個人的には Perl の Jifty のほうに注目してるけど。手軽な Web アプリを目指すなら
あのくらいの割り切りがいいんじゃないかなぁ。
それはともかく Maxima は Lisper 以外のユーザーのほうが多いんじゃないかな。
俺の周りでは数学系の人が Mathmatica と一緒に使ってるつーパターンが多いね。
セットアップを頼まれる事はあったが俺のようなプログラマは自分ではめったに使わない。
0345デフォルトの名無しさん
2006/11/26(日) 21:50:25(defun make-adder (x) (lambda (y) (+ x y))) も
(defun make-adder (x) #'(lambda (y) (+ x y))) も
同じように動くように見えます。(CLISP)
0346デフォルトの名無しさん
2006/11/26(日) 21:56:20Common Lispの規格改訂で同じように動くようになったのだ。
ANSI Common Lisp以降、(lambda ...) は #'(lambda ...) に展開されるマクロ
として定義されている。
本質的にはfunction特殊形式という奴なので、#' を書くのが正書法と言えるかな。
0347デフォルトの名無しさん
2006/11/26(日) 22:07:47いうものだよ。なんでも ANSI Common Lisp 標準化の際に ISLISP を ANSI CL
で実装するための互換レイヤーとして導入されたそうだ(ネタ元: Practical Common Lisp)。
(lambda (y) (+ x y)) はこのコンテキストだと (funcation (lambda (y) (+ x y))) に展開される。
だから実質 #' を書くのとかわらない。こっちも (funcation ...) に展開されるからね。
#' で書くほうが統一されてていいんじゃね。Practical Common Lisp でも #' は全部につけてるよ。
0348347
2006/11/26(日) 22:10:580349345
2006/11/26(日) 22:18:39へぇー。なるほど。ありがとうございます。
ところで CommonLisp では #' してない生の lambda 式の評価結果って何なのですか?
;; Elisp では (consp (lambda (x) x)) => t で、ありゃぁ…って思いますたが
0351デフォルトの名無しさん
2006/11/27(月) 00:27:56(funcall (byte-compile
(lambda ()
(list (consp (lambda ()))
(consp #'(lambda ()))
(consp '(lambda ()))))))
=> (nil nil t)
だよ。lexbind では closure が導入されてるからバイトコンパイルしなくても
同様なんじゃないかな。
0352デフォルトの名無しさん
2006/11/27(月) 00:30:13ANSI以前のCommon Lispではエラーだと思う。lambdaという関数が無いぞ、みたいな。
0353346
2006/11/27(月) 00:33:16いえいえ。ISLISPとの関連は知らなかったので勉強になったよ。
もうちょっと流行るかと思ったんだけどな。>ISLISP
さすがに3つも標準(方言)は要らんということか。
0354345
2006/11/27(月) 01:21:39>>352
どうもです。
ああ、なるほど。バイトコンパイルすると、関数オブジェクトになるんですね。
この方面で最初に触ったのが Scheme だったので、
Common Lisp や Elisp の lambda が、いまいひとつしっくりきませんでした。
0355347
2006/11/27(月) 01:22:00失態をおかした後だったんでね。とりあえず >>332 と >>346 は勝手にライバル視。
しかしなんだ。あんたも ISLISP に期待してたのか。俺も OpenLisp とかインストールしてたクチだぜ。
あと EuLisp とかにも期待してたよ。継続、軽量プロセス(スレッド)あたりに。懐しいなぁ…。
0356デフォルトの名無しさん
2006/11/29(水) 19:35:54いくら探しても<2>の方しか見つからないorz
通販で<1>が買えるところってないでしょうか?
0357デフォルトの名無しさん
2006/11/29(水) 20:29:53http://www.amazon.co.jp/gp/product/4563007846
から「すべての出品を見る」
0358デフォルトの名無しさん
2006/11/29(水) 20:49:44どんな差があるんでしょうか?
<1>+<2>と357さんが挙げてるのでは200ページぐらい量が違うみたいなんですが
0359デフォルトの名無しさん
2006/11/29(水) 21:01:39http://www.amazon.co.jp/gp/product/4563014648
0360デフォルトの名無しさん
2006/11/29(水) 23:07:340361デフォルトの名無しさん
2006/11/30(木) 01:32:12アマゾンのマーケットプレイスに時々出てくるから、マメにチェックするといいよ。
図書館で借りて読むってのも手っとり早いと思う。
0362デフォルトの名無しさん
2006/11/30(木) 03:33:130363デフォルトの名無しさん
2006/11/30(木) 09:13:41原書だと厳しいです(´;ω;`)
361さんのいうとおりアマゾンにでてくるのを気長に待とうと思います。
0364デフォルトの名無しさん
2006/11/30(木) 15:52:52Lispだけでなく英語の勉強にもなるから一石二鳥だと思って原書読むのをお勧めする。
0365デフォルトの名無しさん
2006/11/30(木) 16:14:06うまく訳せないところがあったら聞いていいでしょうか?
0366デフォルトの名無しさん
2006/11/30(木) 16:47:00できればいちいち日本語に訳さなくても意味がとれるよう頑張れ。
文意がよくわからないところは腰を据えて訳すのも一つの方法だけど。
英語の本を読むのは、最初の一冊は大変だよね。
最初の一冊で名著とかある分野のバイブル的な教科書にあたるものが読めると
いい経験になる。
0367デフォルトの名無しさん
2006/11/30(木) 17:12:58このスレには親切な人が多いなあ(´;ω;`)
0368デフォルトの名無しさん
2006/11/30(木) 17:35:310369デフォルトの名無しさん
2006/11/30(木) 18:39:39顔文字くらいでがたがたいうな
0370デフォルトの名無しさん
2006/11/30(木) 19:40:39ttp://www.amazon.co.jp/gp/product/0201083299/
原書2版(1984)
ttp://www.amazon.co.jp/gp/product/0201083728
原書3版(1989)
ttp://www.amazon.co.jp/gp/product/0201083191
ttp://www.amazon.com/dp/0201083191
謎の版(1997)
ttp://www.amazon.co.jp/gp/product/3925118616
原書初版の訳書(1982)
ttp://www.amazon.co.jp/gp/product/4563007846
原書3版の訳書上巻(1991)
ttp://www.amazon.co.jp/gp/product/4563014648
原書3版の訳書下巻(1992)
ttp://www.amazon.co.jp/gp/product/4563014656
1997年の版の詳細について知っている人がいたら
教えてください
0371デフォルトの名無しさん
2006/11/30(木) 21:14:15ヒント: 出版社名
0372デフォルトの名無しさん
2006/11/30(木) 21:35:52ttp://www.amazon.de/dp/3925118616/
1987年になってるけど追求やめ。
0373デフォルトの名無しさん
2006/12/01(金) 00:55:30ジにはいいぞ。わからん事はがんがん聞いてくれ。たとえ途中で力尽きても、
なにもしないよりは遥かにマシだからな。
0374363
2006/12/01(金) 19:31:34PCLの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の場合はちょっと事情が異なる〜
みたいなことを言ってるんだと思うんですが、後半のほうはさっぱりわかりません。
訳すとしたらどのような風になるんでしょうか?
0375デフォルトの名無しさん
2006/12/01(金) 19:39:13Common Lispの場合、実装から見ても言語の定義から見てもちょっと事情が違う。
0376363
2006/12/01(金) 19:55:58(直訳)Common Lispの場合少し事情が異なる、実装と言語がどのように
定義されたかの両方の結果として
をこなれた文にすると
Common Lispの場合、実装から見ても言語の定義から見てもちょっと事情が違う。
という文になるという考えでいいでしょうか?
うーん。難しい・・・
0377デフォルトの名無しさん
2006/12/01(金) 21:57:09これ以上は英語の勉強になってしまう気もするが、直訳の因果関係が逆。
「異なる分け方をしている」→「実装方法と言語の定義に影響を与える」
まああまり細かいことは気にしないで読み進めていけばいいんじゃないだろうか。
なんて言ってる俺も実は読んでる途中だったりする。
0378363
2006/12/01(金) 22:21:11どうも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は文字という意味なのかと思ったんですが
名前の中にある文字のケース ではさっぱり意味がわかりません
どういう風に訳せば良いんでしょうか?
0379デフォルトの名無しさん
2006/12/01(金) 22:32:37英語なんて気合いだよ。w
ちなみに文字のケースというのは大文字・小文字の区別のこと。
0380363
2006/12/01(金) 22:44:12そんな単純なことだったんですねorz
ちなみに今は1ページ読むのに最低30分かかってるんですが
年内までに読み終わることができるんだろうか・・・
0381363
2006/12/03(日) 02:36:35(defun verbose-sum (x y)
"Sum any two numbers after printing a message."
(format t "Summing ~d and ~d.~%" x y)
(+ x y))
という関数の定義が載っているんですが、
format関数の中でどうして~%が使われているんでしょうか?
試しに削った状態で関数を呼び出しても同じ結果になるんですが、
どんな意味があるんでしょう?
0382デフォルトの名無しさん
2006/12/03(日) 02:54:22http://www.lispworks.com/documentation/HyperSpec/Body/22_cab.htm
0383363
2006/12/03(日) 03:09:48えと、~%の意味(改行する)は知っていたんですが
どうして~%を削って(verbose-sum 1 2)のように呼び出しても
"Summing 1 and 2" 3
という結果にならずに
削らなかったときと同じ
"Summing 1 and 2"
3
という結果になってしまうのかがわからなかったんです。
削っても削らなくても同じ結果になるならなぜ~%をわざわざつけてるんだろうか?と
説明不足ですみませんでした・・
0384デフォルトの名無しさん
2006/12/03(日) 03:21:16君の使っているCommon Lispの処理系は評価値をプリントする前に (fresh-line) を
(内部的に)実行する仕様になっているのだろうね。
0385363
2006/12/03(日) 03:47:55を出力する
2 (+ 1 2)
が評価されて3という値になる
3 REPLに出力する前に行の先頭にいなかったら改行する
4 3を出力する
たぶんこんな感じなんですね。
よくわかりました、ありがとうございます。
0386デフォルトの名無しさん
2006/12/03(日) 05:38:42clisp -c test.lisp -l test.exe
とやってみましたが実行すると 「NTVDM CPUがエラー検出したました」
と出て終わってしまいます。
なにがまずいのでしょうか?
0387デフォルトの名無しさん
2006/12/03(日) 05:47:350388デフォルトの名無しさん
2006/12/03(日) 06:00:390389デフォルトの名無しさん
2006/12/03(日) 06:06:340390デフォルトの名無しさん
2006/12/03(日) 06:18:48書けるけど君には無理
0391デフォルトの名無しさん
2006/12/03(日) 06:24:01一応こんなプロジェクトもあるよ。
http://common-lisp.net/project/movitz/
0392デフォルトの名無しさん
2006/12/03(日) 06:37:31じゃあlispでOSを書く場合、JAVAでOSを書くみたいに、
Cでlispインタプリタを作って実行させるのが良いのでしょうか?
Lispでx86のネイティブコードを吐かせるコンパイラって無いのでしょうか?
>>389
HSPって何ですか?
調べたけれど、lispと関係有るのでしょうか?
0393デフォルトの名無しさん
2006/12/03(日) 08:25:160394デフォルトの名無しさん
2006/12/03(日) 10:17:16どんなものがありますか?
0395デフォルトの名無しさん
2006/12/03(日) 10:29:22だった。ハードウェアによる GC 支援なんかはまた将来復活するかもね。
>>394 ほとんど全部じゃないかな。 CMUCL, SBCL, CLISP, LispWorks, AllegroCL, ...
つうか、これつかえばポータブル。 http://www.cliki.net/org-no-carrier-tail-funcall
0396デフォルトの名無しさん
2006/12/03(日) 10:39:050397デフォルトの名無しさん
2006/12/03(日) 10:46:400398デフォルトの名無しさん
2006/12/03(日) 12:40:48a.outやELFのようなファイルを作ることは可能でしょうか。
*.faslや、それをsb-executableで変換したものは出来たんですが、
後者は #!bin/sh からsbclを呼んでいるようですし...。
0399398
2006/12/03(日) 12:46:19私はへたれなんでよくわかりませんが、ちょうど昨日末尾再帰で
1億回のループ(ループというのは正しくないかも)を試したところ
だったので書いてみます。
clispはスタックオーバーフロー、sbclは2秒程度でできました。
0400デフォルトの名無しさん
2006/12/03(日) 12:53:110401デフォルトの名無しさん
2006/12/03(日) 13:06:59% 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
0402デフォルトの名無しさん
2006/12/03(日) 13:46:01以前試したときの記憶では、CLISPは末尾再帰は必ずしも最適化されなかったような。
0403398
2006/12/03(日) 16:19:12どこを見ていいのかわからなかったのですが、おかげでこれを
見つけられました。ありがとうございます。
ttp://www.sbcl.org/manual/Saving-a-Core-Image.html
こんなものがあるなんて...。これを着てれば忘れないかも
ttp://www.cafepress.com/ygingras.18903047
0404デフォルトの名無しさん
2006/12/03(日) 18:19:31どんなコードだったかを秘密にする意図はなんですか?ただの末尾再帰なら
CLISP でも動くよ。だめならループつかえばいいのに。
[1]> (defun foo (n) (if (= n 100000000) t (foo (1+ n))))
foo
[2]> (compile 'foo)
foo ;
nil ;
nil
[3]> (foo 0)
t
0405デフォルトの名無しさん
2006/12/03(日) 18:48:200406398
2006/12/03(日) 19:11:12これによって挙動が違うんですね。
;; 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
0407デフォルトの名無しさん
2006/12/03(日) 19:22:05にコンパイルされる時に最適化が効くようになってる。コンパイル時に最適化
するデバッグとかするときにね。
SBCL はコンパイラのみなので、いきなりコンパイルしちゃって最適化されてる。
インタプリタ実装されてるよ。まだデフォルトじゃないけど設定でインタプリ
タも使えるようになるよ。
0408398
2006/12/03(日) 19:27:47>394
混乱させるような事を言ってすいません。
0409デフォルトの名無しさん
2006/12/03(日) 19:55:38つうか 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}>)
0410363
2006/12/03(日) 20:09:16PCLの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に書かれている事がたいした問題ではないことに繋がるんでしょうか?
0411デフォルトの名無しさん
2006/12/03(日) 20:14:17↓
Lisp では制御構造を評価すると勝手に値が返るのでいちいち return をかか
なくてよい
↓
だから return を書くのが多少面倒でも実質的に問題にならない(C と同等の
意味なら return そもそもを書く必要がないから)
0412363
2006/12/03(日) 20:47:58よくわかりました。ありがとうございます。
どうも文の中にあるmuch less(はるかに少ない)を(言うまでもなく)と
間違って訳したせいで意味がまったく逆になってたせいみたいです。
2の正しい訳は
× RETURN-FROMのほうが多く使われる
ではなくて
○ C系の言語でRETURN文が使用されるほどにはLispではRETURN-FROMは使用されない
ですねorz
0413398
2006/12/03(日) 21:38:27確かにそうなりました。ありがとうございます。
clispもsbclもこうなっていたのか
> コンパイルされる時に最適化が効くようになってる。by 408
0414398
2006/12/03(日) 21:39:090415407
2006/12/03(日) 22:43:05CL やるときは頭を切り替えたほうがいいよ。この辺 C から入った人なんかだと
「コンパイルする == 最適化」が普通だと感じるようだけど。
0416デフォルトの名無しさん
2006/12/03(日) 22:45:050417デフォルトの名無しさん
2006/12/04(月) 01:11:530418デフォルトの名無しさん
2006/12/04(月) 01:42:19するにはどの関数を使えばいいのでしょうか?
0419デフォルトの名無しさん
2006/12/04(月) 02:24:550420デフォルトの名無しさん
2006/12/04(月) 02:52:230421デフォルトの名無しさん
2006/12/04(月) 04:36:45(SAVEINITMEM "test" :EXECUTABLE t)
とやるとCLISPのインタプリタまでつくられてしまいます。
Cやhaskellみたく普通のexeは作れないのですか?
0422デフォルトの名無しさん
2006/12/04(月) 04:47:12対話形式の実行環境、とでもいいましょうか。
0423デフォルトの名無しさん
2006/12/04(月) 08:54:330424デフォルトの名無しさん
2006/12/04(月) 14:03:12全部4メガバイトになっちまいます。
しかも他のPCに持っていくとDLLがない、とかいういつものやつで。
やっぱりLISPってなんだかな〜
0425デフォルトの名無しさん
2006/12/04(月) 14:10:04アホ
0426デフォルトの名無しさん
2006/12/04(月) 14:18:150427デフォルトの名無しさん
2006/12/04(月) 16:56:26皆様の放置プレイがGJです。
0428デフォルトの名無しさん
2006/12/04(月) 18:19:10いつものやつ
???
0429デフォルトの名無しさん
2006/12/04(月) 18:48:09君にはコーマンテクノロジズ社のコーマンリスプをお勧めしておこう
http://www.cormanlisp.com/
0430デフォルトの名無しさん
2006/12/04(月) 21:15:48オモチャの笛で電話機をハックするところから始めようと思います。
0431デフォルトの名無しさん
2006/12/04(月) 21:37:440432363
2006/12/04(月) 22:38:19PCLの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の文章はどういうことを説明してるんでしょうか?
0433デフォルトの名無しさん
2006/12/05(火) 01:43:26let文の中だけでなくそこから呼ばれる関数も含んだものを指している。
> 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つの性質のどちらかを利用する必要がある場合に限り、動的変数を
使うとよいだろう。
0434デフォルトの名無しさん
2006/12/05(火) 01:45:08もらった方が答えやすい。PCLはwebで見れたからいいけど、本だとそうはいかない。
0435デフォルトの名無しさん
2006/12/05(火) 04:17:04とかを後からねじこんだようなものかな?
0437デフォルトの名無しさん
2006/12/05(火) 12:16:18>君にはコーマンテクノロジズ社のコーマンリスプをお勧めしておこう
>http://www.cormanlisp.com/
よくわからないけどありがとうございます。これお金取るんですか?
0438デフォルトの名無しさん
2006/12/05(火) 21:42:140439デフォルトの名無しさん
2006/12/07(木) 01:55:330440デフォルトの名無しさん
2006/12/07(木) 02:42:35それくらい自分でやろうよ。
0441デフォルトの名無しさん
2006/12/07(木) 17:59:360442デフォルトの名無しさん
2006/12/08(金) 23:00:12無いんですか?
0443デフォルトの名無しさん
2006/12/09(土) 01:06:560444デフォルトの名無しさん
2006/12/09(土) 01:08:140445デフォルトの名無しさん
2006/12/09(土) 01:20:55それくらい自分でやろうよ。
0446デフォルトの名無しさん
2006/12/09(土) 01:36:130447デフォルトの名無しさん
2006/12/09(土) 02:51:540448デフォルトの名無しさん
2006/12/09(土) 05:26:400449デフォルトの名無しさん
2006/12/09(土) 11:02:23一方で、Lispだったら、どうつくるのが常套手段なのでしょうか。
たとえば、以下のようなコマンドをlispで実装するのは?
---------
copy file1 file2
move file1 file2
remove file1
-----
ちなみにyaccだとこんな風に書いていく。
list :
| list cmn NL
;
cmnd : COPY source target { action...}
| MOVE source target {action...}
......
0450デフォルトの名無しさん
2006/12/09(土) 11:30:19parser generatorが使いたければcl-yaccとかもある。
0451デフォルトの名無しさん
2006/12/09(土) 12:54:350452デフォルトの名無しさん
2006/12/09(土) 14:41:53の括弧が閉じなくてキモイ))
0453デフォルトの名無しさん
2006/12/09(土) 16:05:20http://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とやっているのですが。。。
0454デフォルトの名無しさん
2006/12/09(土) 16:18:12パッケージが違うからだね。
CL-USER> (minilisp::repl)
もしくは、
CL-USER> (in-package :minilisp)
MINILISP> (repl)
で動くよ。でも元記事、どうみても書きかけなんだけどw
0455453
2006/12/09(土) 16:27:05起動できました。ありがとうございます。
0456デフォルトの名無しさん
2006/12/09(土) 19:06:55スピーチしてる動画があるんですが、どんなこと見たことある人いますか?
0457デフォルトの名無しさん
2006/12/09(土) 19:07:58○どんな内容なのか
ですねorz
0458デフォルトの名無しさん
2006/12/09(土) 20:42:40あれだ、ほら
ゴルフのスイングしてるオヤジとかギターのストロークの真似してる
ニーチャンといっしょ。
0459デフォルトの名無しさん
2006/12/09(土) 20:53:27もう少しカッコに関心を持ってもいいんじゃないかと思うな。
0460デフォルトの名無しさん
2006/12/09(土) 21:10:050461デフォルトの名無しさん
2006/12/09(土) 21:20:17あえて「プログラマとか」って表現を避けてるなお前w
それこそ、lispスレならではの回答だな。
0463363
2006/12/12(火) 16:42:47文章が出てきました。
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,が共通して参照されないのは何故なんでしょうか?
0464デフォルトの名無しさん
2006/12/13(水) 00:44:10前半と後半が矛盾してるよね。後半が間違っているのでは。
0465デフォルトの名無しさん
2006/12/13(水) 01:20:28Peterに直接訊いてみたら?
0466デフォルトの名無しさん
2006/12/13(水) 16:34:46なんか簡為DBもついてくるようなので落として遊んでみるか
0467363
2006/12/13(水) 20:45:31うーん、やっぱり本の間違いなんですかね。
リーディング以上にライティングが苦手な自分にはApressにメールするには
勇気が入りますorz
0468デフォルトの名無しさん
2006/12/14(木) 00:00:220469デフォルトの名無しさん
2006/12/14(木) 00:23:10ttp://common-lisp.net/cgi-bin/viewcvs.cgi/src/code/list.lisp?root=cmucl&view=markup
> (defun copy-tree (object)
> "Copy-Tree recursively copys trees of conses."
> (if (consp object)
> (cons (copy-tree (car object)) (copy-tree (cdr object)))
> object))
0470デフォルトの名無しさん
2006/12/14(木) 13:49:07とすると 5 6 が変なんだけど
* 原稿では 5.0 6.0 になってたのが校正の段階で落ちてしまった
* 5 以上は bignum として読んでくれということになってる (ざっと見た
感じではそのような指定は見付からないけど)
みたいな感じなのかなあ。質問メール出すのがいいと思うよ。
0471デフォルトの名無しさん
2006/12/14(木) 14:00:320472デフォルトの名無しさん
2006/12/14(木) 17:08:03immutableな値でも概念的には「共通して参照される」で構わないだろう。
どのみちそんなことは話の本質にはなんら関係なく、的外れもいいところ。
fixnumだろうがbignumだろうが何かのクラスのオブジェクトだろうが、
copy-treeがそれを複製する能力を持たないという点だけが必要なのだから。
0473デフォルトの名無しさん
2006/12/14(木) 20:15:09「概念的」だと曖昧過ぎるんで「言語仕様的」に落として
「共通して参照される」は相互に eq なオブジェクト
「複製」は相互に equal だけど eq でないオブジェクト
でいい?
0474デフォルトの名無しさん
2006/12/15(金) 01:48:52#lisp に行ったついでに聞いてみたら
<jsnell> I don't see why 1-4 wouldn't be included
だってさ。やっぱ Peter にきくのがいいと思う。
俺の英語ですら通じてるみたいだし、何とかなるよ。
0475デフォルトの名無しさん
2006/12/15(金) 04:00:450476デフォルトの名無しさん
2006/12/15(金) 04:15:31ttp://www.cliki.net/IRC
0477363
2006/12/15(金) 19:24:01件名 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
こんな感じの文章で良いんでしょうか?
0478デフォルトの名無しさん
2006/12/15(金) 20:51:50せっかくの2chだし、英語板にいって聞いてみるのがいいんじゃない?
0479デフォルトの名無しさん
2006/12/15(金) 23:51:01SBCL デベロッパ就任おめでとうございます。
日本語が使えるようになって助かってまつ。
0480363
2006/12/16(土) 20:34:32それでPeterさんから返事があったんですが、やっぱり間違いだったそうで
後でerrataに追加するそうです。
0481デフォルトの名無しさん
2006/12/16(土) 21:58:37Peterからの返事いいなぁ。
0482デフォルトの名無しさん
2006/12/17(日) 18:37:26いますぐ回答できないから後でまた連絡するね、って返事がきたときは
大抵催促しないとその先の返事が戻って来ないけど。
0483363
2006/12/21(木) 01:51:23よくわからない点があるのですが
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*とは一体何なんでしょうか?
ファイルかディレクトリの名前かと思って探してみたんですがどこにも見つかりませんでした。
0484デフォルトの名無しさん
2006/12/21(木) 03:27:320485デフォルトの名無しさん
2006/12/21(木) 05:09:37ASDF パッケージの *CENTRAL-REGISTRY* 変数のこと。
http://www.cliki.net/asdf
0486デフォルトの名無しさん
2006/12/21(木) 09:54:36なんでそこでASDFというモノを調べない……
0487363
2006/12/21(木) 16:52:25CLtL2とかHyperSpecばっかり探してましたorz
それで色々と試しているんですがよくわからない部分が出てきました。
WindowsとClispが入ったlispboxで試していて、
(asdf:operate 'asdf:load-op :practical)とタイプすると全てのソースコードがロードされて、
:practicalの代わりに個々の章のasdファイル名を入力するとその章のソースコードがロードされると
といったことがREADMEに書いてあるんですが、特定の章の.asdファイルをロードしようと
するとASERVEが見つかりませんといったエラーが出てしまいます。
エラーが出る章のasdファイルの中にある(require :aserve)が原因だと思うんですが、
どうすればロードできるようになるんでしょうか?
0488デフォルトの名無しさん
2006/12/21(木) 19:20:08いやはや、ゆとり教育おそるべし。
0489363
2006/12/22(金) 00:43:16366ページに書いてありました。もう少し調べてから質問すべきでしたね。すいません
それで書いてある通りに(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なんですが
誰か同じ様なエラーが出た人はいないでしょうか?
0490デフォルトの名無しさん
2006/12/22(金) 02:08:51SBCL でもいいけど、まず Lisp に慣れないと AllegroServe を入れられないよ
うな気がする。CLISP だとシングルスレッドだから Aserve を起動したら
SLIME とまっちゃうし。
# ちなみに ACL, LispWorks, SBCL と試したけど全部 OK だった
0491363
2006/12/22(金) 20:15:04うーん
http://www.gigamonkeys.com/book/lispbox/
をみると28章と29章でマルチスレッドのサポートが必要になると書いてあるんですよね
でも26章の時点でaserveが要求されていて、特にCLispに対しての記述がないという
ことは、少なくともロードするだけでエラーが出るのは何か問題があるんですよね。
日本仕様のWindowsを使ってるのが問題なのかなorz
0492cream
2006/12/29(金) 11:50:36文字列:"abc"からアトム:abc を得る方法はあるのでしょうか?
欲しいのは、(#\a #\b #\c)や#(#\a #\b #\c)でなくabc です。
よろしくお願いします。
0493デフォルトの名無しさん
2006/12/29(金) 12:07:560494デフォルトの名無しさん
2006/12/29(金) 12:08:080495cream
2006/12/29(金) 12:22:03おかげで問題が解消しました。
0496cream
2006/12/29(金) 13:09:26CLISP での実行結果は以下の通りになっています。
前者の「あ」は期待通りでしたが、後者の「about」は前後には不要な | がついています。
これを無くすにはどうすればよいのでしょうか?
以上、よろしくお願いします。
[66]> (intern "あ")
あ ;
:INTERNAL
[67]> (intern "about")
|about| ;
:INTERNAL
0497デフォルトの名無しさん
2006/12/29(金) 13:25:26不要じゃないから。
0498デフォルトの名無しさん
2006/12/29(金) 13:29:11> これを無くすにはどうすればよいのでしょうか?
(intern "ABOUT")
0499cream
2006/12/29(金) 13:49:29連想配列の car に about としていたところを |about| に変更したりすべきのようですね。
どうも、有り難うございます。
0500デフォルトの名無しさん
2007/01/01(月) 02:27:13lispは人工知能用の言語と聞きました。
でも、なかなか日本語に対応していないみたいです。
1、windowsで問題なく日本語を使える。
2、日本語を問題なく処理できる
3、インタープリタでなくバイナリをつくる。
そんな処理系って有りますでしょうか?
0501デフォルトの名無しさん
2007/01/01(月) 02:31:000502デフォルトの名無しさん
2007/01/01(月) 03:40:05試したわけではありませんが、テンプレを読んだ限り、
SBCLはSJISが使えない。
CLISPはバイナリがつくれない。
ABCLは良い感じですが、javaをインストールしないといけない。
Windowsでバイナリをはくlispの処理系って他に何が有りますでしょうか?
0503デフォルトの名無しさん
2007/01/01(月) 07:17:30一行目を言いたいことがよく判らないので措くとしても、
用途というか目的が判らないので何とも言えないけれど。
実行効率が問題? それともユーザの環境の問題?
そもそもバイナリってネイティヴコードのこと? ……なら 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
それはそうと皆さん明けましておめでとう。
0504デフォルトの名無しさん
2007/01/01(月) 08:05:46>>503
回答有難うございます。
出来たバイナリを配布したいんです。
で、プラットフォームはwindowsで、なるべく、「hogeをインストールしないと使えない」という
状態を避けたいんです。
バイナリはネイティブコードの事です。
clispはスタンドアローンなプログラム、作れるんですね。
有難うございました。
0505デフォルトの名無しさん
2007/01/03(水) 16:17:02guy steeleの仕様書を読んでみましたが見つかりません。
AutoLispだとatoi
Emacsだとstring-to-numberというのがあるようですが
0506デフォルトの名無しさん
2007/01/03(水) 16:31:56(read-from-string "12345")
とかやればいいんですね。
0507デフォルトの名無しさん
2007/01/04(木) 15:13:17以前のレスへのレスになるが、昨日見たら復活していた
ttp://www.is.s.u-tokyo.ac.jp/~vu/97/jugyo/processor/compilerresume/index.html
0508デフォルトの名無しさん
2007/01/04(木) 15:18:42ttp://www.is.s.u-tokyo.ac.jp/vu/96/cad/compilerresume/index.html
0509デフォルトの名無しさん
2007/01/05(金) 04:36:220510デフォルトの名無しさん
2007/01/05(金) 04:57:180511デフォルトの名無しさん
2007/01/15(月) 16:43:17http://itpro.nikkeibp.co.jp/article/NEWS/20061228/258033/
0512デフォルトの名無しさん
2007/01/15(月) 20:14:25letというのは何の略なんでしょうか?
0513デフォルトの名無しさん
2007/01/15(月) 20:23:290514デフォルトの名無しさん
2007/01/15(月) 22:37:580515デフォルトの名無しさん
2007/01/16(火) 11:01:120516デフォルトの名無しさん
2007/01/17(水) 00:22:500518デフォルトの名無しさん
2007/01/18(木) 01:58:50そのまんま一時変数の導入の為に使われるマクロの名前になってる。
【他動-3】 仮に〜としよう
・ Let x = 5, y = 7. 《数学》x を5、y を7としましょう。
0519デフォルトの名無しさん
2007/01/19(金) 03:43:570520デフォルトの名無しさん
2007/01/19(金) 15:40:100521デフォルトの名無しさん
2007/01/20(土) 10:18:570522デフォルトの名無しさん
2007/01/20(土) 10:48:510523デフォルトの名無しさん
2007/01/20(土) 13:55:32S式で記述するとシンドイじゃない
0524デフォルトの名無しさん
2007/01/20(土) 15:34:06ほほう。そうゆうものかな。参考にしたいので、なんか具体例だしてよ。
0525デフォルトの名無しさん
2007/01/20(土) 15:49:08$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;
0526デフォルトの名無しさん
2007/01/20(土) 15:49:38単に不慣れなのでは?
0527デフォルトの名無しさん
2007/01/20(土) 15:50:45何が書いてあるのか俺には理解できないが、S式で書いてくれれば
一兆倍くらいはわかりやすそうだな。
0528デフォルトの名無しさん
2007/01/20(土) 15:53:20-iつかって一行でかけるな
0529デフォルトの名無しさん
2007/01/20(土) 15:59:15こうか
0530デフォルトの名無しさん
2007/01/20(土) 16:17:08qsort [] = []
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な言語で書いた方が楽だな
0531デフォルトの名無しさん
2007/01/20(土) 16:23:26(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版が一番好みだな、困ったことに
0532デフォルトの名無しさん
2007/01/20(土) 16:25:470533デフォルトの名無しさん
2007/01/20(土) 16:27:55(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
0534デフォルトの名無しさん
2007/01/20(土) 16:47:15void 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);
}
これで十分いけてるやん
0535デフォルトの名無しさん
2007/01/20(土) 17:09:05# 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]])
0536デフォルトの名無しさん
2007/01/20(土) 17:12:32qsort [] = []
qsort (x:xs) = qsort [y | y <- xs, y < x] ++ [x] ++ qsort [y | y <- xs, y >= x]
0537デフォルトの名無しさん
2007/01/20(土) 17:13:52つうことで、もういいかな
0538524
2007/01/20(土) 21:28:10(defpattern qsort
() -> ()
(x . xs) -> (concat (qsort (list-of xs (lambda (y) (< y x))))
(list x)
(qsort (list-of xs (lambda (y) (>= y x))))))
0539524
2007/01/20(土) 21:49:35手続き言語つーより Perl の一行野郎への適性だろ。
0540デフォルトの名無しさん
2007/01/20(土) 21:56:35ほーこう書けるんだ、参考になる
これならさほどしんどくないな
0541デフォルトの名無しさん
2007/01/20(土) 22:01:02もうすこしはっきりしたかもな
0542デフォルトの名無しさん
2007/01/20(土) 22:44:13((if true + -) 1 2)
はOKなのに
Common Lispだとできないのはどうしてなんでしょうか?
0543デフォルトの名無しさん
2007/01/20(土) 22:50:12(funcall (if true #'+ #'-) 1 2)
funcall を付けなきゃならん理由は、たぶん可読性がいいからだと思う。
0544デフォルトの名無しさん
2007/01/20(土) 22:54:44可読性のためだったんですね。よくわかりました、ありがとうございます。
あと勉強のためのLispインタプリタを作ろうと思ってるんですが
前置記法じゃなくて中置記法にした場合、○○ができなくなる。
というようなことはあるんでしょうか?
0545デフォルトの名無しさん
2007/01/20(土) 23:03:17普通のLispはcar部を評価しないから
0546デフォルトの名無しさん
2007/01/20(土) 23:11:40じゃないといけないと規定されているから。
そうなっている理由は、それだとネストが深くなったら見難いとかだろ。
((((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
0547デフォルトの名無しさん
2007/01/20(土) 23:20:02よくわかりました。
イメージとしてはSchemeのほうが文法の制限が多いと思ってたんですが
そんなことないんですね
0548デフォルトの名無しさん
2007/01/20(土) 23:20:47中置記法ってのは中置記法のリーダを用意するってこと?それとも構文木を中
置記法表現にしたいってこと? Lisp 処理系は↓のような構成になるので、
リーダが文字列から構文木をつくる -> 評価器 (インタプリタ or コンパイラ) が処理
数式とかが扱いたい場合は、それ用のリーダを書いて内部的には前置記法で処理するのが定石。
MAXIMA とかが例だね。
0549デフォルトの名無しさん
2007/01/20(土) 23:43:00定石通り中置記法で書いてそれを前置記法に変換するリーダを用意しようと
考えてます。
あと括弧もなるべく減らせる構文にしたいなあと思ってます。
それで前置記法でしか表現できない概念があるからLispは前置記法を採用してる
のかな?と思って質問しました。
0550デフォルトの名無しさん
2007/01/20(土) 23:59:40逆にわざわざ中置記法を採用するのは、慣れ以上の理由はないんじゃないか?
まぁ、自分の入門時の感覚を思い出せば、いいたい事はなんとなくわかる。
(+ 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 マクロは冗長に書いてほしかった。
いや面倒だったんだろうけどさ。
0551デフォルトの名無しさん
2007/01/21(日) 00:22:06はい、今はまだSICPをウンウン言いながら読んでる最中なので
読み終えたらそのサイトを参考にしてコツコツ作っていこうと思います。
ところでLispの処理系についての本を探していたら
Lisp in Small Pieces
ttp://www.amazon.com/Lisp-Small-Pieces-Christian-Queinnec/dp/0521545668/sr=1-4/qid=1169306368/ref=sr_1_4/105-7750507-2380444?ie=UTF8&s=books
という本を見つけたんですが、誰か読んだことのある人はいないでしょうか?
書評をみるとべた褒めなので気になっています。
0552デフォルトの名無しさん
2007/01/21(日) 00:43:47まず Scheme か Lisp を知ってる必要がある。
一応ここは Common Lisp 入門スレなので本スレのほうが喰いつきがいいと思うけど。
0553523
2007/01/21(日) 00:54:260554デフォルトの名無しさん
2007/01/21(日) 16:27:48mustangでサンプル動かそうとしたが起動時にこける
0555デフォルトの名無しさん
2007/01/21(日) 17:35:490556デフォルトの名無しさん
2007/01/22(月) 02:56:40うーむ。もうちょっと情報をください。
clisp 2.41 + jdk-1.6.0 で abcl-0.0.0.9 ビルドしてみたけどちゃんと起動したよ。
0557デフォルトの名無しさん
2007/01/22(月) 06:04:20eclipseでソースとりこんでそのまま動かしてる。
jarにしないとダメ・・・なわけはないとおもうけどなぁ。。。??
0558デフォルトの名無しさん
2007/01/22(月) 06:29:260559デフォルトの名無しさん
2007/01/23(火) 11:32:57(defun hoge () (+ 1 2))
と定義して
(list (hoge))と呼び出した場合、まず(hoge)が評価されて
(list 3)になり、それから3がlistに渡されて(3)というリストが返されるという
順番で処理されていくと考えているんですが、それなら
(defun hoge2 () 'a)と定義した場合
(list (hoge2))を呼び出すと
(list a)となってエラーになるはずなのに、ならないのは何故なんでしょうか?
0560デフォルトの名無しさん
2007/01/23(火) 11:46:59これは「a が変数として処理されて、エラーになっちゃうはず」という意味で解釈して返事すると……
実際は (list 'a) となる。
'a は変数として扱われないのでエラーにならない。
'a はシンボル型というもの。シンボル型っつうのは文字列の親戚みたいなもん。
(こんな説明したら他の人から怒られるか)
0561デフォルトの名無しさん
2007/01/23(火) 12:06:15うーん、まだいまいち理解できません・・・
>実際には(list 'a)となる。
'aを評価するとaになって、↓のような順番に計算されていると思うんですが
'aを評価する -> aになり、それが返される -> aがlistに渡される(list a)
関数の最後の式を評価した値が、その関数の返り値となり、
そして'aを評価するとaになるのに、listには'aの値が評価されないままに
渡されてるのが理解できません。
こんな入り口で躓いてしまってるのが悲しいorz
0562デフォルトの名無しさん
2007/01/23(火) 12:14:55> (list 3)になり、
そういう考え方をするなら、厳密には (list '3) と考えるべきだね。
たまたま '3 => 3 だから結果は同じになるだけ。
おおざっぱな規則としては、
(1)数値・文字列・配列などは評価するとそれ自身になる。
(2)シンボルは評価するとそのシンボルに束縛された値になる。
(3)リストの場合は、
(3a)先頭のシンボルが関数なら、その関数を呼び出す。
そのときリストの先頭以外をひとつずつ評価して、関数の引数として渡す。
(3b)先頭のシンボルがマクロなら、そのマクロを展開してその結果を再評価する。
(3c)先頭のシンボルが特殊形式ならそれなりのことをやる。w
ってなところかな。このくらい覚えておけば生きていけるよ。
0563デフォルトの名無しさん
2007/01/23(火) 12:23:00つまり関数の最後の式そのものが、外側の関数の引数になると考えれば
いいんですね。まだちょっとモヤモヤしてるけど、理解できました。
ありがとうございます。
0564デフォルトの名無しさん
2007/01/23(火) 15:31:26hogeというメソッドがあったとして、このhogeは
同じ数の引数しか取ることができないのは何故なんでしょうか?
0565デフォルトの名無しさん
2007/01/23(火) 16:51:550566デフォルトの名無しさん
2007/01/23(火) 17:02:26んじゃないかな。論理的に同じ意味を持った(だから使い方は同じ)関数を渡されたオブジェクト
によって違う実装に導くのが主眼。
メソッドがクラスに隷属するスタイルの(現代の一般的な)オブジェクト指向言語とは元々の
考え方が違う。
あと、CLOS無しのCommon Lisp上のライブラリとして(CLtL1の核を変更しないで)実装できる
ようにという歴史的な意図も多少あるかもしれない。
0567デフォルトの名無しさん
2007/01/23(火) 22:00:48C++なんかのOOPが主語を軸においてるとすれば
CLOSは動詞に軸を置いているって感じなんですかね
もし正方形と三角形の面積を求める1引数のメソッドareaに
後になって立方体の面積を求める2引数のメソッドareaを追加したかったら
やっぱり既存のメソッドの定義を変更して、呼び出している全ての部分に
ダミーの引数を渡すしかないんでしょうか?
0568デフォルトの名無しさん
2007/01/23(火) 22:03:01&optionalにすれば良いのでは?
定義は変えなきゃならんが、呼び出してるほうはそのままで済むと思う。
0569デフォルトの名無しさん
2007/01/23(火) 22:14:16(defmethod area ((x cube) &optional y))
こんな感じにすれば良いんですね。
うーん でもできれば異なる数の引数でもメソッドが定義できる
ようになって欲しいな・・・
0570デフォルトの名無しさん
2007/01/23(火) 22:39:560571デフォルトの名無しさん
2007/01/23(火) 22:55:20引数の数が変わる理由がいまいちわからんけど、自分だったら area-of-plane と
area-of-solid って感じで別名にするかな。
メソッドは動的ディスパッチのために(つまりポリモーフィズムのために)効率が良くなるように
設計されている気がする。引数も違うってことは静的にディスパッチが前提だし、メソッド名も
変えたほうが可読性の点でも望ましいと思う。
0572デフォルトの名無しさん
2007/01/23(火) 22:59:19C++やJavaだとクラスが名前空間を兼ねているんで、
同じ名前がついていても全然別のもの。
STLでbegin、end等が共通してるのはユーザがそういう約束で注意して書いているだけ。
CLOSはそうじゃない。違うものには違う名前。
ここの「同じ」「違う」って概念がまたC++/Javaだと超適当だけど
CLOSでは同じ外部仕様(引数の数とか)で働くもの、と厳密というか
より計算機上の概念として考える。
0573デフォルトの名無しさん
2007/01/23(火) 23:03:300574デフォルトの名無しさん
2007/01/23(火) 23:04:30シンボルだから当然そう
0575デフォルトの名無しさん
2007/01/24(水) 01:29:19(triangle:area x) と (cubic:area x y) とかするか、
型を定義してディスパッチしる。個数でディスパッチなんてだめぽ。
長方形の面積と立方体の面積の区別がつかないじゃん。
(defmethod area ((target <triangle>)) ...)
(defmethod area ((target <cubic>)) ...)
CLOS のメソッドは「引数の個数」よりも引数の型の組み合わせによるメソッドの特定。
0576デフォルトの名無しさん
2007/01/26(金) 22:33:04Javaでlispが使えるとして何に使うんだ?
用途が思いつかないな。
0577デフォルトの名無しさん
2007/01/26(金) 22:34:240578デフォルトの名無しさん
2007/01/27(土) 01:33:46ついうっかりどうでもいい私見をなすりつけちゃいました
0579デフォルトの名無しさん
2007/01/27(土) 02:35:16何かしらのスクリプト言語(たとえばLisp)をつけとくとか?
Emacs の elisp みたいなかんじ。
で、guile も tcl のリプレースとして、という話じゃなかったっけ。
最近どうなってるのかしらんが。
0580デフォルトの名無しさん
2007/01/28(日) 04:48:39それ言い出すと、javascriptもrubyもpythonもhaskellもJavaで動くから
どうなのよ、という状態なんだが。これから何か出てくるんじゃないか?
0581デフォルトの名無しさん
2007/01/28(日) 05:52:14これはFFI 経由よりもお手軽なんで利点と嬉しいんじゃない。
あとは、いわゆる LL と違って CL は compile が規格に入ってるからね。
optimize の指定で JIT とか制御できるようなるとか夢は広がる。
0582デフォルトの名無しさん
2007/01/28(日) 14:50:58もう一度値をセットできるかどうかというのがどういった意味を持っているのかが
よくわかりません
0583デフォルトの名無しさん
2007/01/28(日) 15:01:490584デフォルトの名無しさん
2007/01/28(日) 15:35:31空目しとるな。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
0585585
2007/01/28(日) 15:42:36してほしい場合は defparameter 。稼働中で値を変更されたりすると困るようなのは
defvar を使う。
いわゆる LL みたいに プログラム起動 → 終了 みたいな使い方だと defparamter
のほうが直感的だったりするのかな?使い方によるけど状態をイメージに保存して使いつづける
やり方だとプログラム修正しただけで状態まで初期化されると不便なんで defvar を使う。
0586582
2007/01/28(日) 16:46:420587デフォルトの名無しさん
2007/01/29(月) 16:57:01最初は1つのシンボルが関数と値の二つを同時に持てたなら
x -> xの値を返す
'x -> シンボルxを返す
#'x -> xの指している関数を返す
という風に使い分けをするためなのかと思ったんですが
(setf x 10)
x -> 10
(setf x #'+)
x -> 関数オブジェクト
#'x -> エラー
となって1つのシンボルが同時に関数と値を持てないことがわかりました。
それなら何故applyのような関数を要求する関数には#'を付けた変数を渡すといった
ルールをわざわざ作ったんでしょうか?
0588デフォルトの名無しさん
2007/01/29(月) 17:07:50おそらくシンボルとそれに入っているオブジェクトを混同している。
ひとつのシンボルには「関数値」と「値」という2つのオブジェクトを入れる箱が付いている。
(setf x #'+) は関数オブジェクトを「値」のほうに入れてしまう。
「関数値」のほうの箱に入れたいならば、
(setf (symbol-function 'x) #'+)
とやらなければならない。
シンボルに #' を付けるとそのシンボルの「関数値」に入っているオブジェクトが取り出される。
applyのような関数にはそういうものを渡さなければならない。
0589デフォルトの名無しさん
2007/01/29(月) 17:19:38とてもよく理解できました。わかりやすい説明ありがとうございます。
もう1つ質問なんですが
lambda式はそれ自体が関数名としてみることができるとどこかで読んだんですが
+ -> +
#'+ -> 関数オブジェクト
という風に+をそのまま評価したときは+がそのまま返るのに
(lambda () (+ 1 2)) -> 関数オブジェクト
#'(lambda () (+ 1 2)) -> 関数オブジェクト
という風に#'を付けても付けなくても関数オブジェクトが返るのは何故なんでしょうか?
上で言っているようにlambda式=関数名なら
(lambda () (+ 1 2)) -> (lambda () (+ 1 2))
という風になると思うんですが・・・
0590デフォルトの名無しさん
2007/01/29(月) 17:26:26> (lambda () (+ 1 2)) -> 関数オブジェクト
> #'(lambda () (+ 1 2)) -> 関数オブジェクト
> という風に#'を付けても付けなくても関数オブジェクトが返るのは何故なんでしょうか?
前者は元々のCommon Lisp (CLtL1/2)ではエラーだった。現在の規格(ANSI)では
lambdaというマクロが定義されていて、後者と同じ意味になるようになっている。
おそらく #' を書くのが面倒くさいと主張する輩がいたのだろう。w
0591デフォルトの名無しさん
2007/01/29(月) 17:28:36> lambda式はそれ自体が関数名としてみることができるとどこかで読んだんですが
どこで読んだか知らないけど、それは厳密には正確な理解ではないと思う。
おそらく概念的な説明だったのでは?
0592デフォルトの名無しさん
2007/01/29(月) 17:36:06同名のマクロだったんですね。よくわかりました。ありがとうございますw
>>591
探してみたらPaul GrahamのANSI Common Lisp 23pでした
>ラムダ式は全体として関数名と見なせる。
0593デフォルトの名無しさん
2007/01/29(月) 18:38:280594デフォルトの名無しさん
2007/01/29(月) 22:17:51> + -> +
これって + がそのまま返ってるというより、直前に読み込んだ式が返ってるんでは?
0595デフォルトの名無しさん
2007/01/29(月) 23:42:380596デフォルトの名無しさん
2007/01/29(月) 23:52:54寝言のようにどこかでぶちまけてるんだろうなとは思う。
0597デフォルトの名無しさん
2007/01/31(水) 23:31:16単純なマクロを使うにはどうすればいいんでしょうか?
0598デフォルトの名無しさん
2007/02/01(木) 00:06:060599デフォルトの名無しさん
2007/02/01(木) 00:15:49#define HOGE foo-bar-baz
のような単純にテキスト置換をしてくれるような機能です
0600デフォルトの名無しさん
2007/02/01(木) 00:33:36(define-symbol-macro HOGE foo-bar-baz)
みたいな感じ
0601デフォルトの名無しさん
2007/02/01(木) 17:59:45ANSIになって追加された機能みたいですね(CLtLには載ってませんでした)
ありがとうございます
0602デフォルトの名無しさん
2007/02/01(木) 18:04:34(setf 10 nil)
とやるとエラーになるのに
(defun hoge (x)
(setf x nil))
(setq a 10)
とやって
(hoge a)とやってもエラーにならないのは何故なんでしょうか?
xが10になるのでエラーになるはずだと思うんですが・・・
0603デフォルトの名無しさん
2007/02/01(木) 18:16:39第一引数の場所に数値を書けば必ずエラーになるし、シンボルを書けば
setqと同じ意味になる。
0604デフォルトの名無しさん
2007/02/01(木) 22:08:17関数じゃなくてマクロなんですね
わかりました。ありがとうございます
0605デフォルトの名無しさん
2007/02/02(金) 02:22:27getの引数はシンボル、キーの順番なのは何か理由があるんでしょうか?
0606デフォルトの名無しさん
2007/02/02(金) 02:45:010607デフォルトの名無しさん
2007/02/02(金) 03:21:190608デフォルトの名無しさん
2007/02/04(日) 13:35:44CLispのWindows版をダウンロードしてみたんですが
srcフォルダを見てもmain関数を探す以前にCのソースファイルすら見つかりませんorz
このようなオープンソースのプログラムのソースを勉強する場合、
どういった方法でプログラムを読んでいけばいいのでしょうか?
0609デフォルトの名無しさん
2007/02/04(日) 15:00:54の一部だけだった記憶があるからソースの配布物 (tar.gz) を入手するか CVS
から取得する必要があるよ。ソースの構成は CLISP の IMPLEMENTATION NOTE
に書いてある。
0610デフォルトの名無しさん
2007/02/04(日) 16:43:35ありがとうございます。(´;ω;`)
早速ダウンロードしてなんとか_clisp.cにmain関数を見つけることができたのですが
今まで教科書に載ってあるようなCのコードしか読んでこなかったので
defineやifdefがありまくりのコードはどうやって読んでいけばいいのか
検討もつきませんorz
「現実」のソースを読むためのコツやツールの使い方(今はテキストエディタでファイルを1つ
1つ見ているんですが、多分もっと楽に複数のソースを読むためのツールがあるはず・・・)
Webサイトか書籍はないでしょうか?
0611デフォルトの名無しさん
2007/02/04(日) 17:19:28Implementation Notes の 33 章がソース構成の解説。CLISP のソースは
ちょっと独特で .d というコメント付きのソースを comment コマンド
(util/comment5.c) で .c に変換してる。
コア部分は src/eval.d がインタプリタ/バイトコードインタプリタで
コンパイラは lisp で書かれた compiler.lisp が本体。CLISP はコメントや
ドキュメントは結構充実してるけど日本語の情報は少ないんで、いきなりチャレンジ
するのは敷居が高いかもねぇ。C や LISP はどのくらいの経験なの?
0612デフォルトの名無しさん
2007/02/04(日) 17:42:38プログラムの勉強を始めて2年ほどなんですが
Cの経験はC++でテトリスもどきを作ったことがあるぐらいです
本に載ってるようなアルゴリズムは理解できるんですが、それと現実のソース読むのは
全然別問題ということを痛感してますorz
Lispは半年ほど前にPaul Grahamのエッセイを読んで興味を持ったんですが
SICPや竹内先生の本のevalの実装を見て、実際の処理系はどうやって実装されてるのか
理解したくなったので、いままで勉強のために使っていたCLispのソースを呼んでみようと思いました。
0613デフォルトの名無しさん
2007/02/04(日) 19:07:19ttp://www-masu.ist.osaka-u.ac.jp/~kakugawa/hacks/clisp/
CAMPUS LIsP by 角川先生 のソースなんてどうでしょ
他に "Lisp Java" "Lisp C#" とかで検索するといくつか小さい処理系が出て来る
(GCのある言語でインタプリタを実装するとGCを自前で書かなくていいのでシンプル)
ttp://pc10.2ch.net/test/read.cgi/tech/1160879890/ 「コンパイラ・スクリプトエンジン」相談室11
を覗くのもよいかも? テンプレに挙げられてるサイトとか.
話題がずれるけど,Cの実用アプリを読む練習なら デーモン君のソース探検 という書籍がいいよ
Cの実用的アプリを読む訓練と,インタプリタもしくはコンパイラを理解する訓練は
別々にやった方がいいからねぇ...
0614デフォルトの名無しさん
2007/02/04(日) 19:58:27このソースなら自分にもなんとか読めそうです。ありがとうございました。
あと、話は変わるんですがオープンソースを読んでいくならUnix系のOSを
使っていくようにしたほうがいいんでしょうか?
うまく言えないんですがUnixを使っていれば自然に身に付くような知識が
暗黙の了解としてオープンソースを読むときに必要になるんじゃないのかなと
少し思ったので・・・
0615デフォルトの名無しさん
2007/02/04(日) 20:11:04多少そういう面はある。金掛かる訳じゃないし、とりあえず使ってみるといいよ。
どちらを使ったほうがいい、というのではなく、どちらも知っていることが有益。
0616デフォルトの名無しさん
2007/02/06(火) 21:17:41ディレクトリのファイル一覧を取得して操作したいのですが、
その中に日本語名のファイルが存在した場合
syntax error... (つД`)・゚・
エンコード系の設定が不足しているのか、もともとclispで
日本語名のディレクトリ&ファイルを操作することが出来ないんでしょうか?
0617デフォルトの名無しさん
2007/02/10(土) 11:04:22判定方法はどのようにするのですか?
今は作った派生クラス皆に対して
0618すんません、書き直し。
2007/02/10(土) 11:05:15判定方法はどのようにするのですか?
今は作った派生クラス皆に対していちいち type-of で比較判定をしています。
0619デフォルトの名無しさん
2007/02/10(土) 11:19:27typep 使えばちゃんと継承関係を遡るけど。。
何かCLOSの使い方間違ってないか?どんなクラス作ってんだ?
0620デフォルトの名無しさん
2007/02/11(日) 09:20:060621デフォルトの名無しさん
2007/02/12(月) 01:45:03UNIX だけど、 CLISP で普通に日本語ファイル名つかえてるなー。
よろずやさんとこによると Windows 版固有の問題ぽいね。
system::*pathname-encoding* を設定しても二バイト目が\ の文字を含むと駄目ぽい。
ネタ元 CLISP for Win32 の制限 (http://lispuser.net/commonlisp/clisp.html#id5)
>>620
defmethod でディスパッチするんじゃなくて typep 使って判定?
あんまそーゆうケースに出会わないんだけどなぁ。
0622デフォルトの名無しさん
2007/02/12(月) 11:03:270623620
2007/02/13(火) 01:32:37線形リストの中身に対し順に作業をするのに、
あるクラス A の派生クラスのインスタンスである場合にだけ
特別な事をする様な事をしてまして、そこでの判定時に使ってます。
おっしゃる通り、
そこでの作業について、クラス A のインスタンスか否かで
呼ばれる関数が変わる様にすれば良いのかもしれないんですが、、、
0624デフォルトの名無しさん
2007/02/13(火) 09:34:48実際に(設計が悪くて)必要な場面があるだろうことは否定しないけど
0625デフォルトの名無しさん
2007/02/13(火) 13:22:15ども typep くらいは常識として知っておく必要はあるね。
いろんな手法を知った上で最適な解を選ぶべきで、一概に設計が悪いとも言えないだろう。
0627デフォルトの名無しさん
2007/02/14(水) 13:05:22(let ((x 20))
(defun hoge ()
x)))
(hoge)
とやるとxの値が返るのに
Schemeではエラーになるのは何故なんでしょうか?
0628デフォルトの名無しさん
2007/02/14(水) 13:06:58Schemeにはdefunが無いから
0629デフォルトの名無しさん
2007/02/14(水) 13:08:51すいません、説明不足でした。
Schemeだと
(let ((x 20))
(define (hoge)
x)))
(hoge)
とやってもエラーになるのは何故か?
ということを聞きたかったんです
0630デフォルトの名無しさん
2007/02/14(水) 13:12:44Schemeのletの本体にはdefineとかじゃないものが最低ひとつは必要だから。
例えば
(let ((x 20)) (define (hoge) x) (hoge))
ならエラーにならない。
0631デフォルトの名無しさん
2007/02/14(水) 13:17:23(let ((x 20))
(define (hoge)
x)
10))
こうやると10が返されるんですが、その後に
(hoge)
を呼び出すとやっぱりエラーになってしまいます。
0632デフォルトの名無しさん
2007/02/14(水) 13:21:25letの中のdefineはローカルスコープで定義するから、letの外側では無効になるのよん。
Common Lispとの違いという意味では有意義だけど、Schemeの話を続けるなら他のスレ
のほうが良いかもね。
0633デフォルトの名無しさん
2007/02/14(水) 13:24:40詳細は r5rs の 5.2.2 を参照のこと。
0634デフォルトの名無しさん
2007/02/14(水) 13:28:34defun どこで呼ばれても大域環境に関数を作る
define その呼ばれたスコープ内に関数を作る。当然そのスコープ外ではその関数は使えない
こういう違いだと考えていいんでしょうか?
でもこれだと
(let ((count 0))
(defun reset ()
(setf count 0))
(defun stamp ()
(setf count (+ count 1))))
みたいなのをSchemeでやるのは難しそうですね
0635デフォルトの名無しさん
2007/02/14(水) 13:33:39Schemeで書くとこんな感じかn
(define reset '())
(define stamp '())
(let ((count 0))
(set! reset (lambda () (set! count 0)))
(set! stamp (lambda () (set! count (+ count 1)) count)))
0636デフォルトの名無しさん
2007/02/14(水) 13:42:39すごく参考になりました。ありがとうございます。
バレンタインデーの真昼間なのに質問してすぐに回答してくれるなんて(´;ω;`)
0637デフォルトの名無しさん
2007/02/14(水) 19:26:27どうでもいいけど、お礼なのか嫌味なのか微妙なレスだなwww
0638デフォルトの名無しさん
2007/02/15(木) 00:13:120639デフォルトの名無しさん
2007/02/15(木) 00:19:220640デフォルトの名無しさん
2007/02/15(木) 00:24:19うひゃー文字列としてリストも読み込めるみたいですね。凄い。
ありがとうございました。
0641デフォルトの名無しさん
2007/02/16(金) 02:43:23Windows環境でCLispを起動すると
WARNING: locale: no encoding CP932, using ISO-8859-1
WARNING: *TERMINAL-ENCODING*: no encoding CP932, using locale encoding
という警告が出てしまいます。
これを出ないようにするにはどうしたら良いのでしょうか?
0642デフォルトの名無しさん
2007/02/16(金) 08:04:37libiconv がリンクされてないバイナリなんじゃないか?
あと、イメージにいろいろ取り込んでくと CGI は実用に
ならないだろうね。 FastCGI か mod_lisp を使う事になると思われ。
0643デフォルトの名無しさん
2007/02/16(金) 12:57:122.37を使用していたんですが、最新版を試してみたら警告が出なくなりました。
>イメージにいろいろ取り込んでいく
これはどのような意味なんでしょうか?
あと今気が付いたんですがCommonLispで環境変数にアクセスするにはどうしたら良いのでしょうか?
調べてみるとGaucheならget-envで取得できるみたいなんですが
CLtLやClispのドキュメントを見てもそれらしい関数が見当たりませんorz
0644デフォルトの名無しさん
2007/02/16(金) 20:15:35無理。Clispではできない。
0645デフォルトの名無しさん
2007/02/16(金) 21:47:01そうなんですかorz
わかりました。ありがとうございます。
0646デフォルトの名無しさん
2007/02/17(土) 00:20:04(dolist (c '(33478 33449 33471 33474 33453 33471 33476 10))
(princ (code-char c))
(sit-for 0.03)))
0647642
2007/02/17(土) 15:27:41glibc モジュールがあるなら linux:getenv も使える。
CLISP Implementation Notes の 31.8 を参照のこと。
0648デフォルトの名無しさん
2007/02/17(土) 21:32:16http://mail.python.org/pipermail/python-list/2007-January/423984.html
pythonはみつけました
rubyもあるのでしょうか?
c, c++へのインターフェイスは、あるとどこかで読んだのですが
みつけられませんでした
0649デフォルトの名無しさん
2007/02/18(日) 00:30:530650デフォルトの名無しさん
2007/02/18(日) 01:13:11foreign function interface のこと?
それか SWIG で探すと何かみつかるかも
0651デフォルトの名無しさん
2007/02/18(日) 04:12:29それは LISP と Python とのインターフェースとは言わないような。
Python で書かれた Lisp もどきだろう。素直に Python 使うほうがいいと思う。
Ruby で書かれた Lisp もどきも沢山あるよ。でもスクリプト言語で実装された系の
もので、残念ながら遅い、不完全、作者モチベーション低いなど実用になるものはほとんどない。
C へのインターフェースというのは、 Foreign Function Interface (FFI) と呼ばれる
共有ライブラリや DLL を使う機能。処理系毎にこの機能をもっているが、フリーの実装
だと最近は CFFI という共通化された API を使うのは主流。AllegroCL なんかは SWIG
に対応して C/C++ のモジュールが使えるね。
0652デフォルトの名無しさん
2007/02/20(火) 13:10:16(defun new-hoge (x)
(labels ((getx () x)))
#'(lambda (message)
(if (eq message 'getx)
(getx)))
と定義して
(setf (symbol-function 'a) (new-hoge 10))
とするとJAVAなんかでクラスを定義した後、newしたのと同じことになるんでしょうか?
0653デフォルトの名無しさん
2007/02/21(水) 07:59:17だいたいそれでオブジェクト指向でいうオブジェクトと似たようなもんだ。
実際はクラスベースの OO だとクラスとオブジェクトそのものを分離するとか
継承とかの実装とか、いろいろ細かい点あるけど(メソッドは「クラス」に
属するもので「オブジェクト」に属すとプロトタイプベースぽくなっちゃう)。
0654デフォルトの名無しさん
2007/02/24(土) 11:38:100655デフォルトの名無しさん
2007/02/24(土) 11:54:20無名マクロってどう使うんだろ。
macrolet があれば十分な気がする。
0656デフォルトの名無しさん
2007/02/24(土) 14:25:33付けたもの。たとえば、 when マクロを無名として使うと
(when (condition)
body ...)
↓
((mcaro (cond &body body) `(if ,cond (progn ,@body))) (conditon)
body ...)
となる。嬉しくもなんともない。if や when のような構文は高階関数のように
組み合わせるってこともないからね。だが、それでも君がどうしても無名マクロを
実現したいなら、君の自作インタプリタの評価器で lambda フォーム
のように macro フォームを無名マクロとして評価すれば実現はできる。
0657デフォルトの名無しさん
2007/02/25(日) 09:26:43>マクロとは、プログラムの構造やパターンに名前を
付けたもの
これが今まで読んだ本の説明より一番分かりやすかった。
0658デフォルトの名無しさん
2007/02/25(日) 11:16:36(read)
(format t "test> ")
)
TEST2
* (defun test3 ()
(format t "test> ")
(read)
)
TEST3
*
どっちも同じ挙動になるんだけど(sbcl) 同じ事にぶち当たって解決した人は
いません?
0659デフォルトの名無しさん
2007/02/25(日) 11:32:27バッファリングモードが標準で使われる。 C とかでも同じだが、通常これは改行
されるまで内部バッファはフラッシュされないため、画面に表示されない。
なんで、Common Lisp の finish-output オペレータを使って手動でバッファ内容
を出力してやれば望みの結果が得られるよ。
(defun test ()
(format t "test> ")
(finish-output t)
(read))
0660デフォルトの名無しさん
2007/02/25(日) 11:43:44速いレスありがとう。
バッファリングの問題なのか。
早速試したけど、うまくいかなかったです。
0661デフォルトの名無しさん
2007/02/25(日) 12:02:06省略するか *standard-output* を指定すれば期待どおり動く。
format の最初の引数が t の場合、出力先は *standard-output* になるが
finish-output の最初の引数が t の場合、対象が *terminal-io* になる。
0662659
2007/02/25(日) 12:09:22詳しく言うと、以下の通り。
format の第一引数は nil, t, ストリーム、文字列のいずれか。
nil なら結果が文字列としてかえる。t なら標準出力 *standard-output* になる。
finish-output の引数はストリームで省略時は *standard-output* ね。
0663デフォルトの名無しさん
2007/02/25(日) 12:14:05うーむわかりにくい
0664デフォルトの名無しさん
2007/02/25(日) 12:34:13おかげさまでうまく動きました。
0665デフォルトの名無しさん
2007/02/25(日) 13:04:06http://trac.common-lisp.net/clpython/
というのもあるみたい。swigはclispにも対応しているみたいですね。
0666デフォルトの名無しさん
2007/02/25(日) 22:59:12>>658 のことですが、 emacs+slime上の sbcl では何の問題もないようです。
また、openmclも問題は起きなかったです。起きるのは、terminal上で使うと
きのsbclだけおきてたようです。(openmcl sbclだけしか使ってないけど。)
その対処方法まで教えてくださって重ね重ねありがとうです。
0667デフォルトの名無しさん
2007/02/26(月) 18:21:000668デフォルトの名無しさん
2007/02/26(月) 19:54:51どう包含するかってのは,ANSI Common Lispでも読んで
0669デフォルトの名無しさん
2007/02/27(火) 00:36:32済みません、端的に教えてもらえると助かります。
オーバーロードに無くて総称関数にある機能ってなんですか?
0670デフォルトの名無しさん
2007/02/27(火) 00:40:19overloadとして考えると引数の数の違いなど機能的に不十分とも思える。
0671デフォルトの名無しさん
2007/02/27(火) 02:20:49>>668が言いたいのは第一引数以外の引数もメソッド特定に関与するということだと思う。
あえて機能的に比較してみれば、ってことで、理解していない人が理解しようと
してオーバーロードを持ち込んだ話をするのは間違いの元だから止めた方がいいよ。
0672デフォルトの名無しさん
2007/02/27(火) 03:01:26総称関数はオーバーロードを含んでないっつーか種類が異なるものでしょ。
>>669
オーバーロード
関数のシグネチャ(引数とか返り値の型のことね)によって動作を変えるだけ
総称関数
よくあるOOPだとメッセージを送る対象は左に置くでしょ。
でもCLOSでは引数みたいに右側に置くことで、メッセージを送るオブジェクトが1つでも
それ以上でも一貫したルールで抽象化できる
っていう風に認識してる。
まあ複数のオブジェクトに同時にメッセージを送るのはOOP的にどうなんだろうって感じもするけどね
あとわかりやすい違いといえば>>670も言ってるように、どの処理をするのかが、
オーバーロードではコンパイル時に対して総称関数は実行時っていうことだね。
>>671
未知の物を理解しようとするとき、(少なくとも表面上は)似た物を比較することで理解しようとしていくのは
基本でしょ。それを禁止されたらなにもできないべ。
0673668
2007/02/27(火) 05:39:20これでどうよ
まとめると,「共に,単一の名前に複数の関数を関連付ける」という点では共通しているが...
>>672が言ってるのは:
オーバーロードは静的に(オペランドを与える式の型に従って)解決される
総称関数は動的に(実際にオペランドとなったオブジェクトの型に従って)解決される
(>>670曰く,この点で総称関数はJavaでオーバーライドされたメソッドの解決と似ている)
>>670が言ってるのは:
オーバーロードでは引数リストが違うものを同じ名前に関連付けてよい
総称関数では関連付けられる関数(メソッド)たちの引数リストは共通してなければならない
おまけ
CLOSの総称関数では型のみならず個々のインスタンスについても動作を変えられる(EQLスペシャライザ)
(例えば「第1引数がnumberだったら」に限らず「第1引数が 0 だったら」みたいな)
まぁこうやって羅列されたの読んでもいいプログラム書けるようにはならないわけですが...
0674デフォルトの名無しさん
2007/02/27(火) 11:11:06包含してないじゃん!
0675デフォルトの名無しさん
2007/02/27(火) 11:17:28んなこたーない
0676デフォルトの名無しさん
2007/02/27(火) 12:26:28似たものを比較することで理解しようというなら、まず君の「オーバロード」の定義を提示しなさい。
せめて「○○言語におけるオーバロードと比較して」とか書いてくれないとお話にならない。
0677デフォルトの名無しさん
2007/02/28(水) 02:54:03設計思想から変える必要がある。引数の数によるオーバーロードはあんまり使わない。
個数を変更するような場合(省略可能値とか)オプショナル引数やキーワード引数を
使うとかはあるが、基本的に CLOS の総称関数はそのシステムのインターフェースだ。
そのインターフェースにオブジェクトを当てはめる事でメソッドを特定する。
俺も元々 C++ から来たんで最初戸惑ったけど、総称関数はもっと厳密なインターフェイスなんだよ。
クラスにメソッドが属するシステムだと、結局同じ名前だけどクラス毎に意味が
まったく違うって事があるけど、CLOS では名前の重みがもっと強い。
うーむ、ねむいのでうまく説明できんな。もうちょっと説明考えてみる…。
0678デフォルトの名無しさん
2007/02/28(水) 12:42:09言いきっておしまいにする勇気を持てない? 動的なことが特徴…とかならともかく、
包含するとか、定義を明確にしろとか、名前の重みとか、端で見ていてハズカシイよ。
0679デフォルトの名無しさん
2007/02/28(水) 12:49:24そう言い切っても構わないけど、それで得られるものは少ない。
ここはCommon Lispのスレだし、現状の総称関数の使いこなしを考えるほうが
有意義ではないか?
別の言語を作りましょうという話なら、俺言語作成スレでも立てて勝手にやってくれ。
0680デフォルトの名無しさん
2007/02/28(水) 14:55:27いくら2chでも、その話の進め方は気持ちが悪すぎるよ。
自分の思う通りの結論を相手が出してくれない苛立ちを、勇気にすり替えて相手の人格の問題にすんなって。
あと「端」ってのも痛い。そういうのは自分一人の名義で言ってよ。端の一人である俺にはお前の方がハズカシイし。
0681デフォルトの名無しさん
2007/03/01(木) 07:50:29とりあえず、粘着されて荒れるのもアレなんでしばらく放置推奨?
0682デフォルトの名無しさん
2007/03/01(木) 08:13:28議論されているので本当に知りたい人は当面そっちを参照してねということで。
0683デフォルトの名無しさん
2007/03/02(金) 16:38:17lispで画像処理ができるなんて知らなかった
一番メジャーなのはこれなのでしょうか?
googleの検索でtopに出たので
0684デフォルトの名無しさん
2007/03/06(火) 07:35:540685デフォルトの名無しさん
2007/03/06(火) 10:16:200686デフォルトの名無しさん
2007/03/06(火) 19:26:170687デフォルトの名無しさん
2007/03/06(火) 22:38:110688デフォルトの名無しさん
2007/03/06(火) 23:25:150689デフォルトの名無しさん
2007/03/07(水) 00:23:460690デフォルトの名無しさん
2007/03/07(水) 01:04:570691デフォルトの名無しさん
2007/03/07(水) 01:22:400692デフォルトの名無しさん
2007/03/07(水) 21:11:160693デフォルトの名無しさん
2007/03/08(木) 00:41:39CLISP, 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 という手もある。
0694デフォルトの名無しさん
2007/03/08(木) 00:58:37抜けられなくなるまで使い込めば、XKeymacsでWin環境での操作が極楽になるという特典も付いてくる。
0695デフォルトの名無しさん
2007/03/08(木) 01:00:25これを極めると、
「はて括弧なんてあったかいのう?」大変だ!おじーちゃんがLisp脳でボケちゃった!
が実現できる。
0696デフォルトの名無しさん
2007/03/28(水) 10:46:110697デフォルトの名無しさん
2007/03/29(木) 00:39:38Cray 用の AllegroCL とかは並列化に強そうだが、そゆ話だろうか…
0698デフォルトの名無しさん
2007/03/29(木) 11:18:01可能ではないかと思ったんです。
JavaやC++のようにthreadを意識しなくてもロジックの依存度を解析して
自動で並列化するlispの処理系なりライブラリがあるんではなかろうかと。
0699デフォルトの名無しさん
2007/03/29(木) 11:26:16なんて関数があったとしたら、func評価時に(f 12)と(f2 14)を自動で並列化
してくれるみたいな。
0700デフォルトの名無しさん
2007/03/29(木) 12:18:05左から順に処理する。
それぞれの関数が副作用があるかもしれない。
というわけで自動でやられると困りそう。
lispよりも関数型でしか書けなさそうな言語の方が良いです。
http://www.mu.dk/cl-muproc
0701デフォルトの名無しさん
2007/03/29(木) 15:12:58gotoの欠点って何だっけ?
365 名前: 名無しさん@1周年 投稿日: 2001/01/03(水) 06:58
>>364
後藤さんへの差別
0702デフォルトの名無しさん
2007/03/30(金) 19:26:16サンクス〜
haskellとかならパラレルになるのかな。
lispでもスコープ外の変数に参照を持たない関数のみを並列対称にすれば
出来そうな気もするけど・・・abcl改造してしてみよっかな・・・
0703デフォルトの名無しさん
2007/03/31(土) 00:54:53並列化じゃだめなんか?
0704デフォルトの名無しさん
2007/04/01(日) 13:52:180705デフォルトの名無しさん
2007/04/01(日) 14:34:540706デフォルトの名無しさん
2007/04/01(日) 17:58:46したい。これからはメニーコアの時代らしいのでそうならんかな〜と。
0707デフォルトの名無しさん
2007/04/02(月) 22:51:19プリント文が不必要なときには
(if ...
(then の内容
とシンプルに書けますが,必要になると
(if ...
(progn
(format ...
(then の内容
どうしても progn を入れる必要があるかと思います。
デバッグを終えたときにただプリント文をコメント化するだけなのか,
また progn をはずして綺麗にするのかいつも悩みます。
0708デフォルトの名無しさん
2007/04/02(月) 22:58:50あと、else部が要らないときは when、then部が要らないときは unless を使うのも手だね。
0709デフォルトの名無しさん
2007/04/02(月) 23:07:55たしかにその行を削るだけで済むか。
なんとなく Bourn Shell みたいだ。w
さんきゅです。
0710デフォルトの名無しさん
2007/04/02(月) 23:11:20今必要ってことは将来また必要になるかもしれないし。
あと、デバッグ出力に頼ったということはコードだけではわかりづらかったという
ことなので、その旨コメントを書いておくことが多い。
0711デフォルトの名無しさん
2007/04/02(月) 23:14:55google 先生が教えてくれません。。
0712デフォルトの名無しさん
2007/04/03(火) 00:13:03C言語で言う #if 0 ... #endif
0713デフォルトの名無しさん
2007/04/03(火) 00:16:39トップレベルとか、それに近い見晴らしの良い場所では使うけど。
0714デフォルトの名無しさん
2007/04/03(火) 01:57:05ttp://lispuser.net/memo/lisp/2007-01-25-20-50.html
0715デフォルトの名無しさん
2007/04/03(火) 02:31:46これは好きになれないなぁ。ここまでシンボルで駆動するのってどうよ、っつーか。
:then :else みたいにせめてキーワードシンボルだったらまだ許せるかもしれんが。
同じ理由でCLtL2のLOOPマクロも好きになれない。
0716デフォルトの名無しさん
2007/04/03(火) 08:15:06しかし構造のみであらわすより名前で明示するほうがいい場合もあるしなー
とか loop も Edi Weitz 氏が多用してるのを見て許せるようになった俺がいってみる。
0717711
2007/04/03(火) 08:25:23基本的にはこれは実装依存コードを書くのに使うんだけど、
C の #DEBUG とかみたいなテクニックにも使えると。
0718デフォルトの名無しさん
2007/04/04(水) 02:50:39(apply #'mapcar fn lsts)の部分が何をやっているのかわかりません。
(mapcar fn lsts)と同じかと思って、
(apply #'mapcar #'sqrt '(1 2 3))とやってみたのですがエラーになります。
0719718
2007/04/04(水) 02:52:32(apply #'mapcar #'sqrt '((1 2 3)))
0720flatline ◆r6EONKKhcc
2007/04/04(水) 11:59:55このスレも(専ブラでw)チェックしてますんで何かありましたらどうぞ.
だからと言って毎日即座に有益なお返事ができるとは限りませんが...
0721デフォルトの名無しさん
2007/04/04(水) 21:05:37・・・ホンモノか??
0722デフォルトの名無しさん
2007/04/04(水) 23:07:140723デフォルトの名無しさん
2007/04/06(金) 01:14:340724デフォルトの名無しさん
2007/04/06(金) 02:08:410725デフォルトの名無しさん
2007/04/09(月) 21:27:34地獄Lispはでているようですが?
http://jigoku.bugyo.tk/
0726デフォルトの名無しさん
2007/04/09(月) 21:44:56(= 1 1)
=> #t
どうみても Scheme です。本当にありがとうございます。
0727デフォルトの名無しさん
2007/04/09(月) 21:47:060728デフォルトの名無しさん
2007/04/09(月) 21:56:130729デフォルトの名無しさん
2007/04/09(月) 21:58:050730デフォルトの名無しさん
2007/04/10(火) 07:04:410731デフォルトの名無しさん
2007/04/10(火) 08:09:39multiple-value-bind と values の組は書き直せますか?
S 式の構文解析をするような事をしてるのですが、
多値が出てくると手に負えません。
また、そういうのは何を見ると分かるのでしょうか?
0732デフォルトの名無しさん
2007/04/10(火) 08:24:30eval に、コンパイラ自身のデバッグオプションみたいな、
式を評価してその途中を表示するような機構はないですよね〜?
dissassemble の手前みたいな。。
gcc の RTL は S 式に対応してますが、
RTL 生成後のコンパイラの backend 部分を
フォロー出来るようなオプションです。そういうのは実装依存ですか?
0733デフォルトの名無しさん
2007/04/10(火) 23:19:12知人にドン引きされた。Scheme と名乗っていて欲しかったよ…
0734デフォルトの名無しさん
2007/04/10(火) 23:46:53> S 式の構文解析をするような事をしてるのですが、
> 多値が出てくると手に負えません。
これだけじゃ何をやろうとして、何がどう手に負えないのかわからん。
多値は最小 20 個程度なんだから評価器に組み込んでおくべきじゃないかなー。
>>732
まず eval にはコンパイラは使われない。大抵インタプリタで動作する。
コンパイラの挙動がどこまで見えるかは実装依存。たとえば ACL には :explain で
コンパイラがどんな型を推論したかや、変数の boxing、クロージャの割り当
てなどがコンパイル時に表示される機能がある。
0735デフォルトの名無しさん
2007/04/11(水) 02:11:00かなりあまってるらしいね。
0736デフォルトの名無しさん
2007/04/11(水) 02:18:47なんとかフェスティバルに行く勇気はなかったわw
0737デフォルトの名無しさん
2007/04/11(水) 06:03:44多値の束縛を lambda で書き直したい、ってこと?
措いて、一応 multiple-value-bind はマクロだよ。一番下の notes 参照。
http://www.lispworks.com/documentation/HyperSpec/Body/m_multip.htm
とはいえじゃあ multiple-value-call をどうすんのかって話になりそうだけれど。
目的によっては values を list に、multiple-value-call を apply に置き換えるので何とかならんかな。
0738デフォルトの名無しさん
2007/04/11(水) 07:22:59多値なしの評価器で lambda のみで書き直すのは難しいんじゃないかな。
multiple-value-call はスペシャルオペレータだし、values -> list, multiple-value-call -> apply
の変換はやっぱり一般化できない。
(lambda () (if (= (random 2) 1 (values 2 3))))
0739デフォルトの名無しさん
2007/04/11(水) 08:01:33lambda だけで書き直せるよ。
Common Lisp では末尾呼び出しの最適化が保証されないし、できるというだけで
あまり意味がないと思うけど。
0740デフォルトの名無しさん
2007/04/11(水) 13:00:160741731
2007/04/11(水) 18:39:24今回は lambda にこだわらずになんとかベタに評価器部分に書き込む事にしました。
別に Common Lisp にこだわってるわけじゃないんですけど,
資産の問題が。。それから,継続の仕組みを使うところだけ
外部 Scheme を呼べたら面白いかも。って思いました。
もちろん,FFI を使えばいいんでしょうけど,なんとなくスマートでないような。。
宗教戦争はおいておいて,
あんまり Common Lisp から Scheme を呼ぶような,もしくは逆の
プログラムを書く人はいなさそうですね。w
0742デフォルトの名無しさん
2007/04/11(水) 18:44:45そういうわけで結構実装が難しいので誰も作らないのかも。
0743デフォルトの名無しさん
2007/04/11(水) 20:25:03CL で実装された Scheme を使えば継続つかえるよ。
でも俺は混在させようとは思わないけどな・・・。
継続はあらゆる問題を解決する魔法じゃないしね。
継続よりも効率的な Python みたいな yield や、Erlang みたいな
軽量プロセスが欲しい。そうゆうインターフェースを実装したライブラリ
では満足できない。処理系組み込みのがほしい〜。
0744デフォルトの名無しさん
2007/04/12(木) 21:55:35Pythonのyieldとcall/ccの効率に差があるかどうかは実装によるのでは。
0745743
2007/04/12(木) 22:46:13Erlang のプロセスは皆が憧れてるだろ?海外でも Lisper は皆大抵
Erlang スキーだし。よく論争になってるし。俺が Erlang を知ったのは
何年か前の ポーカーサーバを Lisp で書くよ → Erlang のほうが楽だった…これイイわ みたいな記事だったし。
cl-muproc でガワだけは真似できても、やぱっり組み込みじゃないと
性能がでない。というかスレッドと Erlang プロセスが 1:1 では重すぎる。
やっぱり実装レベルで軽量プロセスをサポートしてくれないと、でも Lisp だと
副作用があぅあぅあぅ。 Franz か LispWorks かどっちかが実装してくれんかなぁ。
0746デフォルトの名無しさん
2007/04/13(金) 00:40:38http://wagerlabs.com/2006/8/25/writing-low-pain-massively-scalable-multiplayer-servers
Erlangに憧れてるなら素直にErlangを使えばいいんじゃないの。
0747743
2007/04/13(金) 23:18:27それそれ。つうか素直に Erlang をつかってるとも。だけど、CL + 並列プログラミングが
個人的には理想に近いかなーと思うわけ。いや、Erlang の機能に不満があるわけじゃないんだが…。
なんつうか、関数とマクロとか好きなレベルで抽象化できるのに慣れていると、もうちょっと
好き勝手したいなーとか思うんだよ。メッセージによるプロセス間通信は「正しい事」のような予感する。
0748デフォルトの名無しさん
2007/04/14(土) 10:45:29今、気合いだけで訳してる(240ページまでいった)けど
英語が苦手せいか(英検5級w)なかなか進まない・・・
そもそもきちんと理解できてるかどうかも疑問だけど
全部訳せたらPeterさんにメール送って公開してもいいかどうか聞くつもり。
0749デフォルトの名無しさん
2007/04/14(土) 12:13:110750デフォルトの名無しさん
2007/04/14(土) 12:20:55全部訳してから許可もらうのかよ! 逆だろ! 他にも作業してる奴がいるかもしれないとは
おもわなかったんかい。同時多発車輪の再発明は Lisper の常だなぁ…。
0751748
2007/04/14(土) 12:29:53うわーん、嬉しいのか、悲しいのかよくわからない気分になってます(;つД`)
>>750
・途中で挫折する可能性大
・きちんと訳せる自信がなかった
だったのできちんと完成させてからにしようと思ってました。
・空気読まずにマイペースで訳を続ける
・PAIPかSmall Piecesの訳にチャレンジしてみる
上の選択肢ならどっちがお薦めですかね?
0752デフォルトの名無しさん
2007/04/14(土) 13:09:38個人で権利関係がなんとかできるとはおもないし。だから「やってるよー」とどっか宣言はしとけよ。
コソーリやってたら誰もコンタクトとれないじゃん。PAIP 欲しいな。
0753デフォルトの名無しさん
2007/04/15(日) 20:48:10よく理解していないものが訳したものというのは、混乱させられる原因になる.
PCLは精力的にやっておられる方が訳をしているようだから、公開されたら良い
見本になると思うよ。自身で訳したものとの違いをしっかり検討して実力に蓄
えると考えればいい。748さんなら、現在のど根性訳は人生の中の練習問題だと
おもえばいい。
0754デフォルトの名無しさん
2007/04/15(日) 21:25:46関数の振る舞いでワケがわからなくなったので教えてホシイ事があります。
emacs-lispで
(functionp '+)
とするとtが返りますがCLISP上で同じ事をするとNILが返ります
同じように判定するにはどうするのだろうとCLISPのfunctionpの項目を眺めていたのですが
(functionp #'+)
であればTを返す事を知りました。
このfuncitonpの振る舞いの違いというか、変数に束縛してある関数が関数であると知る簡単な方法がわかりません。(#'が何をする物かもわからんのです,ググレナイ)
0755デフォルトの名無しさん
2007/04/15(日) 21:42:19CommonLispの変数は値と関数を同時に持つことができるのだよ。
ふたつのセルを持っていると思えばよい。
#'は変数から関数の方を取り出す操作
0756デフォルトの名無しさん
2007/04/15(日) 22:06:43common lisp の functionp は引数が関数であるかどうかを判定する。
elisp の functionp は引数が関数または関数定義を持つシンボルであるかどうかを判定する。
0757デフォルトの名無しさん
2007/04/15(日) 22:17:20「シンボル」それ自体は「関数」ではないということ
シンボルから「関数」を取り出すのが #' の役目
0758デフォルトの名無しさん
2007/04/15(日) 22:34:56変数というか Common Lisp ではシンボルに値セルと関数セルという別々のスロットがある。
それぞれ関数で取り出せる。値セルは (symbol-value 'symbol) で参照できるし、関数セルは
(symbol-function '+) で参照できる。
(functionp '+) == (functionp (symbol-value '+))
(functionp #'+) == (functionp (symbol-function '+))
「変数に束縛」という理解から「値スロットへの束縛」と「関数スロットへの束縛」という二種類を
まず意識するといい。効率が悪そうに見えるかもしれないが、ローカルな束縛ならコンパイラはシンボル
を作成せずに効率よく扱ってくれるんで実際は効率問題にはならない。
0759デフォルトの名無しさん
2007/04/15(日) 23:04:56これは違うだろ
0760デフォルトの名無しさん
2007/04/15(日) 23:25:49'+ ならいいけど、誤解を招かないとも限らないので一応
* (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]
0761758
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
0762748
2007/04/16(月) 01:52:40そうですね、例外のところなんか読んでて意味がよくつかめてなかったり
してましたから・・・
でも途中まででも訳したのは良い経験になったと思います。
0763デフォルトの名無しさん
2007/04/16(月) 02:26:46何か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可能なのかがさらにわからないのです。
0764デフォルトの名無しさん
2007/04/16(月) 02:43:49> (setq plus '+)
この時点で、plusというシンボルの「値」スロットに + というシンボルが入る。
> (functionp plus) -> NIL
シンボルというものは「関数」ではないので当然NIL
> (funcall plus 1 2) -> 3
plusの「値」は + なので、これは
(funcall '+ 1 2)
と同じ。
実は funcall は第1引数にシンボルが来ると、そのシンボルのグローバル関数スロットの値を
自動的に取り出すという(ややおせっかいな)機能があるので、これは動作する。
シンボルが関数として定義されているかどうか調べるのは fboundp を使うのが良いだろう。
で、真だったらそのシンボルを funcall へ渡すことができる。
0765デフォルトの名無しさん
2007/04/16(月) 22:57:20こ、これは・・・
ttp://www.cs.stevens.edu/~dlong/images/rider.gif
0766デフォルトの名無しさん
2007/04/16(月) 23:40:240767デフォルトの名無しさん
2007/04/17(火) 00:07:140768デフォルトの名無しさん
2007/04/17(火) 01:15:36なにこれ仮面ラムダー?
0769デフォルトの名無しさん
2007/04/17(火) 02:11:03754 で入門書読みながらっていってたけど、何読んでるの?
> なぜにfunctionpがnilなのにfuncall可能なのかがさらにわからないのです。
functionp は引数のオブジェクトを評価しない(スロットの参照にいかない)ので、
(functionp '+) は「シンボル + は関数か?」という意味になる。当然 NIL。
(functionp #'+) は「関数 + は関数か?」という意味なので T
funcall は第一引数に「関数修飾子 (function designator)」をとる。これは関数もしくは
グローバル環境で関数名を表わすシンボルね。後者なんで functionp が NIL でもシンボル +
を funcall できるわけ。今は + を上書きしたりはしてないだろうから、#'+ == (symbol-function '+) ね。
0770デフォルトの名無しさん
2007/04/17(火) 09:06:23> (#'が何をする物かもわからんのです,ググレナイ)
遅レスだけど、
'bar が (quote bar) であるのと同様に
#'foo は (funtion foo) と同じこと。
' も #' もよく使うから省略形が用意されてると思えばいいよ。
0771デフォルトの名無しさん
2007/04/17(火) 11:38:21clispからsbclへと移ったのですが
clispだと引数に対象ファイルを指定してやればそのままそのファイルの
プログラムが実行されてました。
sbclだとそのまま引数に指定しても何も起こらないのですが
sbcl --loadとするとどうやらそれ以降に指定したファイルを実行できるようです
ところがSBCL is free...というバナーメッセージまで表示されてしまい、これを消したいのですが
(clispだとファイルを指定すればバナーが消えて結果だけが表示されてました)
これはどうすればいいのでしょうか?
どなたか教えてください
0772デフォルトの名無しさん
2007/04/17(火) 11:55:32マニュアルに書いてありました
吊ってきます...
0773デフォルトの名無しさん
2007/04/17(火) 23:21:43sbclで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)).
と出てしまってどうしてもコードが通りません
どこが間違ってるのかさっぱりわからないのですが
どなたか教えてくれると幸いです
0774デフォルトの名無しさん
2007/04/17(火) 23:37:00#(127 0 0 1)
0775デフォルトの名無しさん
2007/04/17(火) 23:44:13すみません、もうちょっと詳しく教えていただけませんか?
0776デフォルトの名無しさん
2007/04/17(火) 23:47:27すみません、わかりました
0777デフォルトの名無しさん
2007/04/18(水) 01:03:23>>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))))
次はもっと困った時だけ質問するように努力します(できたらこれ買って読め馬鹿って本ありましたら紹介お願いします)
0778デフォルトの名無しさん
2007/04/18(水) 01:11:34> ただこの関数に関数でなく生の数値がバインドされたシンボルを食わせるとエラーになる理由は理解していません。
> <<<(and (symbolp someting) (fboundp someting))とする事で回避はできました>>>
それは fboundp に「シンボル」ではなく、生の「数値」を食わせたから。
fboundp は普通の関数なので、引数は評価される。だから
> (setq something 1)
> (fboundp something) ->エラー
では something が変数として評価されて (fboundp 1) や (fboundp '1) と同じことになる。
(数値は評価するとそれ自身になる)
関数を呼び出す場合、その引数は事前に評価されるわけだが、マクロだとか特殊形式(quoteやfunctionなど)
の場合は暗黙には評価されない。(マクロの場合、結果的に評価される場合はある)
0779デフォルトの名無しさん
2007/04/18(水) 03:15:59とやって
(let ((x 20))
(symbol-value 'x))
とすると10が返されるんですが、この場合、xと20はどのようにして結びつけられて
いるんでしょうか?
0780デフォルトの名無しさん
2007/04/18(水) 08:01:12symbol-value cannot access the value of a lexical variable.
ということなので、つまり、let内の変数xにはアクセス出来ない。
ダイナミックスコープ(ここでは外部変数x)になる。
let内外の2つの変数xは見た目は一緒だが、内部では別という事も付け加えておくね。
0781デフォルトの名無しさん
2007/04/18(水) 18:36:53symbol-functionも同じだとすると
グローバル変数の関数を入れる場所にはdefunなり(setf (symbol-function 'x) #'(lambda ~)
などでアクセスできても、レキシカル変数では関数を入れる場所にはアクセスすることができないという
ことになるんでしょうか?
0782デフォルトの名無しさん
2007/04/18(水) 19:16:06http://www.lispworks.com/documentation/HyperSpec/Body/f_symb_1.htm
> setf may be used with symbol-function to replace a global function
> definition when the symbol's function definition does not represent a
> special operator.
0783デフォルトの名無しさん
2007/04/18(水) 19:25:38ごめん、誤読してた。>>782 は無し。
0784デフォルトの名無しさん
2007/04/18(水) 21:16:14レキシカルに関数を束縛できるのは labels と flet だけじゃないかな。
setf ではアクセスできないと思う。
(言ってる意味を取り違えてるかな?)
0785デフォルトの名無しさん
2007/04/18(水) 22:28:25えっとレキシカル変数の「値を入れる場所」に値を入れるには
(let ((x10))
で、
「値を入れる場所」に関数を入れるには
(let ((x #'(lambda
を使ってできるけど
レキシカル変数の「関数を入れる場所」に関数を入れることは
symbol-functionではレキシカル変数の「関数を入れる場所」にアクセス
できないから、レキシカル変数の「関数を入れる場所」に関数を入れることが
できないのかどうなのかを確かめたかったんです。(ああややこしい・・・)
0786デフォルトの名無しさん
2007/04/18(水) 22:33:35ふーむ。入門 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)))
0787デフォルトの名無しさん
2007/04/18(水) 22:44:28その言い方を借りると、レキシカルの「関数を入れる場所」に関数を入れるのが flet と labels だ。
(let と let* に相当する)
0788デフォルトの名無しさん
2007/04/18(水) 22:48:07仕事でErlangを使っているのかどうか気になる。
差し支えのない範囲でこのスレかErlangスレで語ってほしい。
0789デフォルトの名無しさん
2007/04/18(水) 22:58:190790デフォルトの名無しさん
2007/04/21(土) 22:29:36unsigned char op_code;
unsigned long payload_len;
} pkt_header;
ある特定のデータブロックから
こういうpkt_headerにデータを入力する
pkt_header header = (pkt_header*)ptr
見たいな処理ってどうやってLispで実現すればいいのですか?
またpkt_headerのような構造体をどうやってLispで定義すればいいのですか?
Lispには型がないのでどうやっていいかさっぱりわかりません
どなたか教えてください。
0791デフォルトの名無しさん
2007/04/21(土) 22:35:32(setf header (make-pkt-header ...))
0792デフォルトの名無しさん
2007/04/21(土) 22:40:34unsigned char op_code;
unsigned long payload_len;
の部分はどうすればいいのでしょうか?
当方IA-32で開発しておりますので
unsigned charは8ビット(1 byte)
unsigned longは32ビット(4byte)
という風に型を固定にしたいです
ネットワークから流れてくるデータのヘッダ処理をしたいのですが。
0793デフォルトの名無しさん
2007/04/21(土) 22:40:53どちらにしても質問の趣旨がちょっと曖昧。
0794デフォルトの名無しさん
2007/04/21(土) 22:46:53言葉が足らず申し訳ありません。
それです、バイトコードをデコードしたいのですが
どうすればよいのでしょうか?
0795デフォルトの名無しさん
2007/04/21(土) 22:52:23対象言語を全く知らずに開発できるわけないんだから、せめて言語仕様くらい
ちゃんと目を通しとけよ。
0796デフォルトの名無しさん
2007/04/21(土) 22:53:56#そういう所に終始するならCが一番楽だと思う。
0797デフォルトの名無しさん
2007/04/21(土) 23:07:52(op-code 0 :type (unsigned-byte 8))
(payload-len 0 :type (unsigned-byte 32)))
でおk
0798デフォルトの名無しさん
2007/04/22(日) 00:03:14教えていただいた培風館の方は見つかりませんでしたがANSI CommonLispの方は入手できました。
elispのスタイルらしくないのは本当にエディタのマクロとしてしか使ってないのでLispらしいことは何もしてきていないからです。
文脈で解釈異なる置換とかを正規表現ひねり出すより楽に制御したいとか、人様の設定ファイルを自分用にとかその程度なものですから。
0799デフォルトの名無しさん
2007/04/22(日) 00:46:02read-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 使うなとか末尾再帰しろとか言われないよ。最初は慣れた
スタイルでよちよち歩いてきゃいいのさ。心掛けさえ間違えなきゃ、スタイルなんざいつでも訂正きくからね。
0800デフォルトの名無しさん
2007/04/22(日) 23:43:43ISO-2022-JP、UTF-16の相互変換と入出力に対応してて、日本語で正規表現の
検索ができて、httpとftpとsmtpとpop3のライブラリがついてて、WindowsとLinuxで
動作する無料でオープンソースな処理系はありませんでしょうか。。。
0801デフォルトの名無しさん
2007/04/23(月) 00:18:33でいいんじゃない? Common Lisp なら… ABCL かねぇ。っても、希望の
ライブラリは全部 Java のライブラリにお任せなので文句は Sun にいってくれ。
まぁ「ありません」ってことだね。Scheme でいいなら Gauche とか。
0802デフォルトの名無しさん
2007/04/23(月) 00:28:58基本はCLISPであとは適当なライブラリを探せば済むんじゃないかな
0803デフォルトの名無しさん
2007/04/23(月) 00:34:53ライブラリは http://www.cliki.net/networking とかから探して来るとヨロし。
0804デフォルトの名無しさん
2007/04/25(水) 06:46:323. (一部)
Lispハッカーがリストにシンボルをプッシュして済ますようなことさえも、
数々のクラスとメソッドからなる一つのファイルになってしまう。
リストにシンボルをプッシュして済ますって具体的には
どういうテクですか?
0805デフォルトの名無しさん
2007/04/25(水) 07:11:17ワロタ
0806デフォルトの名無しさん
2007/04/25(水) 13:58:40sbclの
The variable |0X10| is unbound
というエラーはどういうエラーのときに出るものなのでしょうか?
0807デフォルトの名無しさん
2007/04/25(水) 14:14:42> The variable |0X10| is unbound
> というエラーはどういうエラーのときに出るものなのでしょうか?
sbclは知らないけど、CommonLispでは||で囲まれたものは
シンボルと解釈されます。
たとえば、
(setq |1234| 5678)
|1234| ;; => 5678 が返ってくる。
ってな感じ。
なので、上記のエラーはシンボル|0X10|は値を持たない、
って意味だろうね。
0808デフォルトの名無しさん
2007/04/25(水) 19:32:56もしかして16進の数値のつもりで0X10とか書いて無いだろうな?
0809デフォルトの名無しさん
2007/04/26(木) 03:51:3016 進は #X ね。
http://www.lispworks.com/documentation/HyperSpec/Body/02_dhi.htm
0810デフォルトの名無しさん
2007/04/27(金) 01:27:02そのへんの文法の仕様書ってネットで見れないのでしょうか?
>>809のところがやっぱり良いのかしら
0811デフォルトの名無しさん
2007/04/27(金) 20:22:14> 今 lisp のパーサを作ろうと思っているのですが、
> そのへんの文法の仕様書ってネットで見れないのでしょうか?
Common Lispなら
http://www.cs.cmu.edu/Groups/AI/html/cltl/cltl2.html
0812デフォルトの名無しさん
2007/04/28(土) 00:38:00演算子を使った関数表記をするにはどうしたらよいのでしょうか?
0813デフォルトの名無しさん
2007/04/28(土) 02:01:550814デフォルトの名無しさん
2007/04/29(日) 01:29:58ここにある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))
最初の部分をこのように書き換えました。
どなたか教えてください。
0815デフォルトの名無しさん
2007/04/29(日) 01:32:190816デフォルトの名無しさん
2007/04/29(日) 01:44:51(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)
と出てしまうのですが...これはどうなってるんでしょうか?さっぱりわからないです...
0817デフォルトの名無しさん
2007/04/29(日) 02:16:49で何か気がつかないかね?
ヒント:defpackageの:useオプション
0818デフォルトの名無しさん
2007/04/29(日) 02:31:19ありがとうございます。できました!
0819デフォルトの名無しさん
2007/04/29(日) 07:47:33>>812 (vector 1 2 3) => #(1 2 3) とかそゆ話?
>>818
SBCL は CGI には向かないよ。Java や Ruby on Rails が CGI に向かないのと同じで、
フットプリントがでかいから。CL-HTTP とか mod_lisp とか hunchentoot とか。今だと
hunchentoot かな。
0820デフォルトの名無しさん
2007/04/29(日) 10:41:24> >>811 CLtL2 より HyperSpec のほうがいくね?
どうだろ…
まあ、811が「仕様書」って言ってたから、仕様書ならCLtL2のほうだろうと…その程度。
0821デフォルトの名無しさん
2007/04/29(日) 15:47:26フットプリントとはなんでしょう?
0822デフォルトの名無しさん
2007/04/29(日) 15:53:440823デフォルトの名無しさん
2007/04/29(日) 15:59:31お取りになられるからなあ。起動時にヒープサイズを指定出来るようになると良いんだけど、
今の実装じゃ無理だよね。
0824デフォルトの名無しさん
2007/04/29(日) 16:00:31しかしsbclのほうがいろいろライブラリ周りとかそろってて便利なのでは?
今はメモリも安くなったし、大丈夫かなーなんて...
0825デフォルトの名無しさん
2007/04/29(日) 16:14:40ってことだね。CGI以外の手法について学ぶと良いだろう。
0826812
2007/04/29(日) 19:05:34(+ (vector 1 2 3) (vector 3 4 5)) -> #(4 6 8)
こういう事したいのですが、常にvec+とか自分で定義しないといけないんでしょうか?
次数も様々なものを使ってみたいのですが。
複素数は (+ #C(1 2) #C(3 4) ) -> #C(4 6)
の様に通るのですが、任意次数のベクトル演算は何故できないのでしょう?
0827デフォルトの名無しさん
2007/04/29(日) 19:07:46つAPL
0828デフォルトの名無しさん
2007/04/29(日) 19:08:320829819
2007/04/30(月) 00:32:01↓こんな意見は何故だめなんだ?いちいち
集合っぽくしたいよ!! (+ (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) ...)
0830デフォルトの名無しさん
2007/04/30(月) 00:34:56(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))
0831デフォルトの名無しさん
2007/05/01(火) 13:46:34ありがとうございます。
まさにそれを欲していました。
でもどこかにMathパッケージありそうな気もするのに何故に見つからないんだろう orz
こつこつ作って整備して精進します。
0832デフォルトの名無しさん
2007/05/01(火) 22:36:56ttp://www.okada.jp.org/RWiki/?%A5%D9%A5%AF%A5%C8%A5%EBTips%C2%E7%C1%B4#content_1_1
0833デフォルトの名無しさん
2007/05/02(水) 04:10:31この辺はもう見た?
http://www.cliki.net/mathematics
0834デフォルトの名無しさん
2007/05/02(水) 13:51:02昔のものならxlispstatという手もある。xlispstatをclへ再実装プロ
ジェクトでもないんだろうかね。
0835デフォルトの名無しさん
2007/05/09(水) 18:04:180836デフォルトの名無しさん
2007/05/09(水) 18:35:360837デフォルトの名無しさん
2007/05/10(木) 13:44:57質問があれば比較的高速に返答がくれますよね
おそらく偉大なLisperがROMってくれているんですね
ありがたいことです
0838デフォルトの名無しさん
2007/05/10(木) 21:06:01ごめん、黙ってたけど……
質問にはおれがLispで書いたAIが回答してるんだ
0839デフォルトの名無しさん
2007/05/10(木) 23:19:56グレアムキター
0840デフォルトの名無しさん
2007/05/10(木) 23:55:430841デフォルトの名無しさん
2007/05/11(金) 23:38:13Scheme の関数はなんですか?
0842デフォルトの名無しさん
2007/05/12(土) 01:53:14処理系依存ならできるものもあるだろうけど。
0843デフォルトの名無しさん
2007/05/12(土) 12:11:47define にて関数 f を定義することで、
f の値を求める事と f の関数定義を構文解析することとを
同時に行いたかったのですが。
quote を使って関数定義部を書いて eval を使って値を評価するのは、
なんとなくイケて無い様に思えるのですが普通はそうするのですか?
(スレ違いスマソ)
0844デフォルトの名無しさん
2007/05/12(土) 15:58:54そういう場合にはマクロで隠蔽してしまえばよろし。
関数は定義された時点でVM用のコード、あるいは機械語に落とし込まれたりする場合が多いので、
レアケースのために全体をS式で覚えておくのはムダだからだ。
0845デフォルトの名無しさん
2007/05/12(土) 23:43:12なんでそんな事したいんだ?何か目的があるんだよな?
手段よりも目的をさきに語ってくれたほうがネタがでやすいと思われ。
0846デフォルトの名無しさん
2007/05/13(日) 00:33:57俺は別にかまわんが、どっちかっていうとこっちのスレの方が妥当なんではあるまいか。
http://pc11.2ch.net/test/read.cgi/tech/1177065699/
0847デフォルトの名無しさん
2007/05/13(日) 10:11:31良ければ教えてくれませんか?
(例えば、ANSI Common lisp p 114の (defun (setf bref) ...))
0848デフォルトの名無しさん
2007/05/13(日) 16:38:53汎変数
0849デフォルトの名無しさん
2007/05/13(日) 20:28:41本スレはやっぱり。。
0850デフォルトの名無しさん
2007/05/14(月) 16:59:26さんくす。defunで汎変数が定義出来るのですね。
0851デフォルトの名無しさん
2007/05/16(水) 23:06:05マクロの中のマクロもmacroexpandするにはどうしたらいいでしょうか?
たとえば、以下の例だと progn の中の incf も展開した形で見たいのですが・・
[1]> (macroexpand '(progn (incf aaa)))
(PROGN (INCF AAA)) ;
NIL
0852デフォルトの名無しさん
2007/05/16(水) 23:54:21SBCL だけどこんなかんじ。でも、素直に (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
0853デフォルトの名無しさん
2007/05/17(木) 00:06:57入力と出力を調査する対象な任意のプログラムなん?それとも四則演算 + 自前オペレータのみ?
簡単なインタプリタ書いて、結果を実行するかわりに入出力を集めていくのかなー。
日本語で、オンラインで読めて、短いインタプリタだとこのへんか?
ttp://lispuser.net/memo/lisp/2006-12-08-03-54.html
評価するかわりに入出力のグラフを作りあげていくようにするんかなぁ。
0854デフォルトの名無しさん
2007/05/18(金) 00:23:22ありがとうございます。
macroexpandが展開するのはリストの car部分がマクロの場合だけ。
今回のケースだと展開したいと思ってた incf は cdr にあるから展開はしてくれない。
cdrの中のマクロも展開したいなら自分で書くしかない。
ってことですね。
とりあえず、SLIMEとかを覚えようと思います。
0855デフォルトの名無しさん
2007/05/18(金) 00:54:211. 全部展開したい事は稀 2. 自分で作ってもあんま手間ではない 3. SLIME 使えばほぼ不要
というあたり。なんで不要かというと、
http://lispuser.net/memo/emacs/2006-12-20-20-36.html (後半の移動系操作に注目)
http://lispuser.net/emacs/lisphacking.html (SLIME のキー操作に注目)
これを組み合わせてつかうから。展開したい式の先頭へ移動した後、 C-c RET (macroexpand-1) もしくは C-c M-m (macroexpand)
で展開形が別ウィンドウに表示されてとても便利。
0856855
2007/05/18(金) 00:59:250857デフォルトの名無しさん
2007/05/18(金) 01:07:110858デフォルトの名無しさん
2007/05/22(火) 18:03:03Javaや.NETベースのアプリケーションサーバや、
Perl/Ruby/PHP/Python等のLightweight Languageの上に構築されていますが、
なぜそこにLispが含まれていないのでしょうか?
0859デフォルトの名無しさん
2007/05/22(火) 21:09:380860デフォルトの名無しさん
2007/05/25(金) 12:34:41(setf y '(setf x 1))
でyに代入された(setf x 1)
ってデータですよね?
これって文字列なのでしょうか?
0861デフォルトの名無しさん
2007/05/25(金) 12:42:380862デフォルトの名無しさん
2007/05/25(金) 12:49:520863デフォルトの名無しさん
2007/05/25(金) 12:58:160864デフォルトの名無しさん
2007/05/25(金) 13:05:52setfはただのデータであり要素なんですね。
0865デフォルトの名無しさん
2007/05/25(金) 13:14:290866デフォルトの名無しさん
2007/05/25(金) 21:35:01中に著者で竹内郁雄という人のサインが書いてありました。
竹内郁雄って言う人はどのくらいの有名人なのでしょうか?
持ってた方がよいですか?
0867デフォルトの名無しさん
2007/05/25(金) 21:44:060868デフォルトの名無しさん
2007/05/25(金) 23:04:01最近たらいまわし関数が流行ったけどあれを考えた人
0869デフォルトの名無しさん
2007/05/25(金) 23:12:430870デフォルトの名無しさん
2007/05/25(金) 23:19:40ttp://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 みたいな命令は無いのだろうか
0871デフォルトの名無しさん
2007/05/25(金) 23:21:54最初の (if t x y) 間違いw
(if t 'x 'y) だった
0872デフォルトの名無しさん
2007/05/26(土) 00:39:160873デフォルトの名無しさん
2007/05/26(土) 01:10:34あり、emacs lispを少し触ってみた。
意外と悪くないかなという感じなので、色々と使ってみようと思うんだけど、みなさんどんな
用途にLisp使ってます?
0874デフォルトの名無しさん
2007/05/26(土) 02:09:26>>868
わかりました。
良く分からないですけど、大字にとっておきます。
>>869
誰がうまいこと言えと(ry
ちにみに「下らぬ本に感化されぬよう御注意」って書いてありました。
0875デフォルトの名無しさん
2007/05/26(土) 02:23:170876デフォルトの名無しさん
2007/05/26(土) 02:28:340877デフォルトの名無しさん
2007/05/26(土) 09:19:54ちょっと重い計算。
あとはいろいろやりたいけど、そこまでやってない。Practical Common Lisp
と言う本のようにやってみたけどな。
0878デフォルトの名無しさん
2007/05/26(土) 15:05:01(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;
}
と同じことでしょうか?
そしてこれがレキシカルスコープってやつですか?
0879デフォルトの名無しさん
2007/05/26(土) 19:07:53こんなんじゃ駄目?
(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)
0880デフォルトの名無しさん
2007/05/26(土) 20:02:27>>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))
0881デフォルトの名無しさん
2007/05/26(土) 21:12:07(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)
0882デフォルトの名無しさん
2007/05/26(土) 21:33:55おぉー出来た、すごい
>>880 氏の弁だと if の部分がコンパイル時に評価されちゃうから実はダメってことなのかな?
でもコード書いてくれてありがとう
感謝
>>880
たしかに言うようにこういう処理自体やる機会ってのはほとんどないし利点も薄いから
たぶんアプローチ自体間違っているんだろうね
ただ Lisp は他の言語では制御構文でしかない if でも値を持っているのでこんなの簡単にできる
と思って意地になってハマっちゃったよw
>>881
おぉぉおぉおおおお!
でけた!
defself ってこう言うときに使うんだぁ
言語で言語を拡張すると言う Lisp のハック精神炸裂だ
よっし、C や Perl に勝った!
オレってなんて稚拙な精神構造なんだろ
とほほ
0883デフォルトの名無しさん
2007/05/26(土) 21:34:59もうこんなんばっかw
それにしても Lisp はおもしろい
0884デフォルトの名無しさん
2007/05/26(土) 21:53:05コメントさせてもらうと、else を省略可能にしないほうがいいね。
(setf (if nil x) 10) とかのケースを考慮しないと。
>>882
そう、if に関してはアプローチが間違っている。Dan Kogai の出してる例だと
substr 等に関しては setf が一般解を出している。setf を拡張可能にする事により、
ユーザーが定義したデータ構造にも setf できるようになってるわけ。
でも、あまり黒魔術的な技で勝ち負けを考えないほうがいいと思うよ。C や Perl がチャンピオンだからね。
0885デフォルトの名無しさん
2007/05/26(土) 23:26:190886デフォルトの名無しさん
2007/05/27(日) 00:18:500887デフォルトの名無しさん
2007/05/27(日) 00:24:41厨うぜーwww
0888デフォルトの名無しさん
2007/05/27(日) 00:29:49おめーがうぜーよ
自重しろ
0889デフォルトの名無しさん
2007/05/27(日) 00:32:53┏┫┃┃┃ 雑談は ┃┃┃┣┓
┃┃┃┃┣┓ ここまで ┏┫┃┃┃┃
┃ ┃┃┏━━━┓┃┃ ┃
┃ 雑談 ┣┫ . ・∀・ ┣┫. STOP!┃
┗━━━━┛┗┳━┳┛┗━━━━┛
┏┻┓┃
┏━┛ ┣┻┓
┗━━━┫ ┗━┓
. ┗━━━┛
0890デフォルトの名無しさん
2007/05/27(日) 01:19:35判ってるよw
だからとほほな精神構造だなと自戒しまして
しかしマクロが強力な Lisp は黒魔術の幅も広そう
他の言語だと結局言語を再実装する形になりそうだ
ただマクロは強力すぎるから適用範囲を掴むまでは手を出せないかなぁ
On Lisp と Shiro 氏のマクロの記事読んで感覚はつかめたけど
たぶん解っているだけで判っていないと思う
0891デフォルトの名無しさん
2007/05/27(日) 01:31:420892デフォルトの名無しさん
2007/05/27(日) 01:36:22リフレクションに類するものは非推奨になってるんだな。つまらん。
0893デフォルトの名無しさん
2007/05/27(日) 04:35:43これって仕様ですか?
0894デフォルトの名無しさん
2007/05/27(日) 09:05:53コンパイル時にreadlineライブラリが組み込まれてないんじゃないかなぁ。
*features*は確かめてみた?
0895デフォルトの名無しさん
2007/05/27(日) 13:38:27プリコンパイルしてJVMやCLIで(JavaやC#並に)効率よく動かそうというというのがあるから、
動的言語でもそういう機能は嫌われる傾向かも。(スレチすまん)
0896デフォルトの名無しさん
2007/05/27(日) 14:34:200897デフォルトの名無しさん
2007/05/27(日) 14:36:410898デフォルトの名無しさん
2007/05/27(日) 15:25:36ちょっとでも計算量を少なくしたいときfold⇒reduceにする。
集合が単位元をもたないときもreduceを使わざるを得ない。
0899デフォルトの名無しさん
2007/05/31(木) 01:08:10適用範囲はかなり広いから、やれなくなるよ。
ちょうど、孫悟空が三蔵法師らと天竺にでかけるが、近づこうとすれば
遠くなるみたいな感覚はにてるよ。w
0900デフォルトの名無しさん
2007/05/31(木) 06:29:00結局お金が足りなかったので何も買わずに帰った
0901デフォルトの名無しさん
2007/05/31(木) 22:18:060902デフォルトの名無しさん
2007/06/01(金) 01:58:46なんてな。
0903デフォルトの名無しさん
2007/06/01(金) 02:02:020904デフォルトの名無しさん
2007/06/01(金) 06:01:040905デフォルトの名無しさん
2007/06/01(金) 10:07:540906デフォルトの名無しさん
2007/06/01(金) 16:48:07(if (= n 0) 1
(* m (expt (- n 1) m) )))
すごい恥ずかしい質問なのですが、
expt$ (m n)と関数定義して、
(expt (- n 1) m)で引数の位置入れ替えているのに
なんでちゃんと計算できるのでしょうか?
JavaとかCでもちゃんと計算できましたっけ?
Lispが特殊なの?
0907デフォルトの名無しさん
2007/06/01(金) 16:57:310908デフォルトの名無しさん
2007/06/01(金) 20:01:48lispのどこが好きですか?
lispのソース付でお願いします。
lispはかじっただけで、まったく知らないに等しいのですが、出力を意識しなくていいのが好きです。
'(javaだとSystem.out.print("??????")\;とか大変なんですよね。)
0909デフォルトの名無しさん
2007/06/01(金) 20:12:360910デフォルトの名無しさん
2007/06/01(金) 20:16:19> 出力を意識しなくていいのが
アハハハハハハハハハハハハハハハハハ
0911デフォルトの名無しさん
2007/06/01(金) 20:44:31私が馬鹿でした。
そりゃこの関数で
2の3乗計算しても同じ結果になるはずだ。
こんな罠があったとは!
0912デフォルトの名無しさん
2007/06/01(金) 20:53:10向いていそうなのか見てみたんだけど、簡単なレポあった方がいいかな?
0913デフォルトの名無しさん
2007/06/01(金) 21:44:56余計なものがなく、コンパイラまでしっかり意識された仕様が決っているところが好き。
具体的にいうと (compile *) (disassemble *) が好き。
まぁ、関数名とか format とかにふざけてるとしか思えない機能とかあるけど歴史だしねぇ。
良くも悪くもコレだ。
http://www.lispworks.com/documentation/HyperSpec/Front/index.htm
打てば応答が帰ってくる REPL が気にいったってことかな。そうだとすると、なかなかイイセンスしてる。
ランタイムにコンパイルするっても JIT とは別なんだよなー。対話式なのとインクリメンタルな部分が。
0914デフォルトの名無しさん
2007/06/01(金) 21:48:40CLISP: スタンドアロン .exe 化できる。この中だとサイズも小さめ。
SBCL: Win32 はまだいろいろ制限多い。ランタイムデカいので .exe 化のメリットあんまりない。
ACL: .exe/.dll 化可能。だが、そもそも配布用ラインセスが高額。個人では無理。
LispWorks: .exe/.dll 化可能。Professional 版以上にはランタイムライセンスがついてくる。日本語回りは未知数。
0915908
2007/06/01(金) 22:59:08昔、若気の至りで買った"common LISP 第2版"を見てるんですが、compileとdisassembleの所ってかなりのページ数がさかれてて、仕様としてかなり確りしてそうですね。
かなりのページ数なので、読もうとして気が遠くなりました。^^
0916デフォルトの名無しさん
2007/06/02(土) 00:35:35確かにその通りだった。hello表示させるだけで、CLISPはイメージと
ランタイムあわせて8Mくらい。SBCLは20Mくらい。
ACLはTRIALバージョンだと、exeを実行するたびに、「sutdent ver買ってね」と
言われる。
少し間口を広げて、ISLISPのOpenLispも試してみたんだけど・・・
Freeバージョンはexe機能ないのね。マニュアルにはやりかたが
書いてあるけど、仕様が変わっていてあんまり役に立たない。
exe化のための、中途半端な機能だけ残ってた。
っていうか、ソースがOpenじゃないのに、OpenLispとは・・・
0917デフォルトの名無しさん
2007/06/02(土) 00:41:27http://www.cormanlisp.com/
0918デフォルトの名無しさん
2007/06/02(土) 00:50:28GCL や ECL とか?うーん Windows じゃあイマイチだねぇ。というか Lisp のほうが
「フリーソフト」だの「オープンソース」だのより古いんだからそゆ批判はちと的外れかも。
RMS も元は Lisp システムが使いたくて GNU はじめたのにね。まぁ、Symbolics の件もあって
CL は好きじゃないらしいが。
>>917
日本語がダメです。英語のみならかなりコンパイル速度といい統合されてるアセンブラといい
イイ処理系なんだけどね…。
0919デフォルトの名無しさん
2007/06/02(土) 01:42:10ついちょっと愚痴ってしまいました。いや、実はオープンソースでないことに
対して愚痴っていたのではなくて、紛らわしいところに愚痴っていたのです。
standalone exeができると書いてあったので、マニュアルみながら試行錯誤したら
全然マニュアルどおりでなく、仕方なくいろいろと付属のライブラリの中を見ると、
ISLISPをCにコンバートするものがあったんですが、その吐き出すCのコードをコンパイルするのに、
本体のコードが必要。それで"Open"ってついているからきっとどこかにソースが・・・と探して
徒労に終わってしまったので、つい(^^;
そうそう配布を考えなければ、SBCLはwindowsでも結構いけますね。
LTkも使えたので、GUIもOKでした。速度もCLISPに比べて10倍くらい速い。
スレッドは使おうとするとハングしてましたけど、意外といい感じでした。
lispはいい言語ですね。初めてソース見たときは、どう読んだらいいか
わけわから、ずかなりインパクトありましたけど。
0920デフォルトの名無しさん
2007/06/02(土) 02:03:00Lisp はいい言語けど、最初のインパクトとうか精神的ダメージはでかいだろうな。見た目がアレだから。
よく再チャレンジする気になったね。2ch で聞くくらいだから身近に Lisp の師匠居ないんでしょ?
俺は師匠に出会わなきゃいろいろ理由をつけて蔑んでたままだったろうなぁ〜と今でも思う。
そうそう、TIME マクロも結構好きだね。俺は他の言語では profile する前に
t1=timeGetTime(); 処理; t2=timeGetTime(); print(t2-t1); .. みたいなお手軽計測を多用する
ダメ人間だったからね。TIME マクロみて、コードを「包み込む」系のマクロの便利さを知った。
0921デフォルトの名無しさん
2007/06/02(土) 02:53:45じっさいお値段はいくらくらいなの?
Franzのページにもお見積もりとか書いてあるだけだし
0922デフォルトの名無しさん
2007/06/02(土) 08:10:21(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
0923デフォルトの名無しさん
2007/06/02(土) 08:32:24さらに (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 入れるとかしよう。
0924デフォルトの名無しさん
2007/06/02(土) 09:17:56か?(しかもCPU占有率50%程度で)
XP SP2, Eclipse3.2.2, Cusp for Windows 0.80 = sbcl 1.02
心当たりありましたら、ご教示いただけましたら幸いです。
0925デフォルトの名無しさん
2007/06/02(土) 09:23:47Eclipse 側で終了時に SBCL を止める設定をしないとまだ残るでしょ。
SBCL 側を (quit) するようにフックしないといけないと思うんだけど Eclipse 手元にない。
SBCL も 4 ヶ月近く前の版ってことは Cusp ってあんまりメンテされてない?
Emacs + SLIME のほうがオヌヌメかも。
0926デフォルトの名無しさん
2007/06/02(土) 09:57:32ご教示ありがとうございます。了解しました。
Eclipseを終了してから、SBCLを終了するということですね。
まだ使いはじめたばかりで、設定がきちんとできていなかったかもしれません。
windows+xyzzyを使っているので、emacsはなんとなく抵抗があるのですが、
emacs+slimeも検討してみます。
0927デフォルトの名無しさん
2007/06/02(土) 09:58:20間違い訂正
Eclipseを終了する前に、SBCLを終了するということですね。
0928デフォルトの名無しさん
2007/06/02(土) 10:19:2220〜50万くらい
0929デフォルトの名無しさん
2007/06/02(土) 10:40:22100万超じゃなかったっけ?
かなり昔にOまたさんに聞いたのだが。下がったのかな?
0930デフォルトの名無しさん
2007/06/02(土) 10:48:560931デフォルトの名無しさん
2007/06/02(土) 13:25:02>>929
>>930
なるほど、ACLのお値段はそれ位するのですか。
でも、思っていたよりは普通。
RISCマシン用の商用コンパイラもそれくらいするのが普通だし。
0932918
2007/06/02(土) 14:49:06実はlispはxyzzyのカスタマイズなどに使っているので、今では
普通のコードを読むのと対して違いを感じないんですが、
初めて見たときは驚きました。その当時いくつか読める言語が
あったんですが、読み方がさっぱりわからなくて。
emacs, xyzzyはlispのとっかかりとしてはいいですね。
豊富なソースと、簡単に動作確認できる環境が師匠って感じです。
0933918
2007/06/02(土) 14:50:26配布を考えるなら、windowsではECLが一番いいかもしれません。
(ただし、Cコンパイラが別に必要)
hello表示させるアプリで、全部で1.5M程度でした。(ecl.dll + test.exe)
もちろん、exeになります。あとコンソールアプリで日本語表示もOKでした。
Cとの親和性がとてもよく、Cができれば組み合わせていろいろできそうです。
コンパイルは一度Cのコードを吐き出して、インストールされている
コンパイラを使ってコンパイルする形になります。
またVisual C++2005を使って、ソースからコンパイルすることも可能でした。
その場合は、一部ソースを直す必要がありましたが、Cがある程度わかる人であれば
問題がない程度です。VC++の最適化は強力なので、こっちができる人は
こっちの方がいいかも。
0934デフォルトの名無しさん
2007/06/02(土) 14:55:19ありがとうございます。
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))」
とどちらともとれる説明になっていて困っています。
0935デフォルトの名無しさん
2007/06/02(土) 16:05:531. (gcd$ n (mod m n)) の個所が「末尾呼び出し」の定義
2. 実際に実行される (gcd$ 12 6) が「末尾呼び出し」する
普通は JMP 命令になる。
普通の関数呼び出しでも、たとえば (mod m n) は関数呼び出しの定義で、
呼び出しの実行は (mod 30 18) なわけ。でもどっちも「関数呼び出し」って
言えば通じるよね。末尾再帰も慣れればいちいち定義と実行を分けて考えなくなるよ。
0936デフォルトの名無しさん
2007/06/02(土) 21:03:370937デフォルトの名無しさん
2007/06/02(土) 21:17:051. 絶対値の定義は何か、日本語なり自分のわかりやすい表記なりで書け
2. その表記では何らかの条件はないか、あるならそこに if が当て嵌められる
3. 条件はどんなものか。それは Lisp で書くとどうなる?
4. 条件が真のときは何を返し、偽のときには何を返すか。それは Lisp で書くとどうなる?
というステップを踏めば書けるだろ。あとは教科書でも読んでちゃんと復習しろ。
0938デフォルトの名無しさん
2007/06/02(土) 21:22:09(defun abs-936 (x) (if (minusp x) (- x) x))
もう、ここまでは読まないかもしれないが、別に宿題なら宿題ではっきり授業聞いてませんでした助けて!!
と言えばいいのに。なんでバレバレの質問するんだろう。真面目な回答者なら逆に気分を害して答えてくれないかもよ。
俺は本人のためにならない事大好きだからバンバンこたえちゃうけどね。
0939デフォルトの名無しさん
2007/06/02(土) 21:28:07興味も関心もないんだって。本人が努力なんてする気もないんだから考え方とか教えても無駄だろ。
Emacs Lisp スレでも書いたが、興味もやる気もないし、礼儀もしらないんだから荒しと考えてさっさと
回答を与えて満足させるべき。
で、宿題なんだから minusp もダメだろう。おそらくベストな答はコレ。これで○もらえるはず。
(defun my-abs (x) (if (< x) (- x) x))
0940937
2007/06/03(日) 00:00:30その意見には反対。興味がなくて授業も聞いてなくて、それでこういう場で宿
題を聞いているのだろうというのには同意するけど、そのまま答えを与えては
いけないとおれは思う。
こういうやつに答えをそのまま渡したらアホがアホなまま、なんとなく単位を
取れてしまうだろ。それが一番まずい。
それよりは、自力で解かせるべくヒントだけを与えた方がいい。それで自分で
問題を解けるようになればベストだし、そこでやる気を見せないやつは落第し
た方がいい。
0941デフォルトの名無しさん
2007/06/03(日) 00:09:21取れてしまうだろ。
社会にアホが
0942デフォルトの名無しさん
2007/06/03(日) 00:11:070943デフォルトの名無しさん
2007/06/03(日) 00:16:53マルチ乙
0944937
2007/06/03(日) 00:28:49そもそも、やる気がなかろうが話を聞いていなかろうが、これが講師やTAなら、
そんな学生の事情とは関係なく、きちんと理解させるような教育をしなきゃいかんのよ。
宿題系の質問て、ようするに授業で対応しきれない学生へのTAの仕事をボラン
ティアでやっているのと同じなので、質問に答えるなら、同じようにちゃんと
質問者を教育する態度で臨まなければならない。
っておれは思っているので。
0945デフォルトの名無しさん
2007/06/03(日) 00:34:100946939
2007/06/03(日) 00:43:42宿題って事を偽装したつもりでネットの暇人が答え書いてくれるだろうとか浅知恵する連中は
自分で考えたりしないし、感謝もしないよ。連中は答えを写して提出するだけ。
でも今後は「宿題であること」「やる気がありません」と明言されていない場合は
ズバリ答えを書くのは控える事にする。
……まぁ、Common Lispの宿題なんてのがそうそうあるとは思えないが。
0947デフォルトの名無しさん
2007/06/03(日) 03:26:52とても丁寧な回答ありがとうございます。
しっかり理解できました。
>>936
自分ならこうしますかね。
abs(x)
-x,x<0の時
x,それ以外の時
↓lispにすると
(defun abs$ (x)
(if (< x 0) (- x) x))
absは組み込み関数だから関数名はabs$にしました。
0948デフォルトの名無しさん
2007/06/04(月) 01:34:35別に Common Lisp に詳しいわけじゃないので、
自分が知らない機能があるかもしれません。
せっかくなので一通りは実装したいのですが、
Common Lisp らしい(?)機能ってどんなのがあるでしょうか?
ちなみに GC とか クロージャは実装できました。
末尾再帰とか遅延評価とかって Common Lisp にあるんでしたっけ?
0949デフォルトの名無しさん
2007/06/04(月) 01:37:36windows上のcommon lisp処理系で使える、以下の条件を満たす
プロットライブラリを探しているのですが、どなたか心当たり
ありませんでしょうか。
1. GUIで拡大縮小できるもの
2. 1.を満たし、かつ一画面に複数のグラフを表示できるもの
3. グラフを印刷可能なもの(もしくはpost scriptで保存できるもの)
(4. できれば、ソースが手に入るもの。)
いろいろと試してはみたのですが、どうもいいものが見当たりませんでした。
(gnuplotはマルチプロットした状態で、GUIで拡大縮小すると表示が
おかしくなります。またclplotは表示などはよさそうなのですが、
元になるplplotのライブラリは、windowsではマウスのイベントを
取得できるドライバが使えないようで、GUIで操作は難しそうです)
もしご存知の方がいましたら、よろしくお願いします。
0950デフォルトの名無しさん
2007/06/04(月) 02:19:48自分もあまり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ページに実装例が書いてあります。
自分もいつかインタプリタ作ってみたいなぁ。
今読んでる本の最後の課題で作るけど。
0951デフォルトの名無しさん
2007/06/04(月) 03:34:11(defun factorial (n)
(factorial-loop n 1 1))
で。
0952デフォルトの名無しさん
2007/06/04(月) 10:10:44Lisp らしいというとマクロだろうね。もう実装済みかもしれないけど。
あとは何だろう。多値とかかな?
末尾再帰があるとは?最適化が仕様で要求されてるかということなら、されてないよ。
遅延評価も仕様にはなかったと思う。
0953デフォルトの名無しさん
2007/06/04(月) 22:46:08プログラマブルなリーダーとかコンパイラとか。コンパイラマクロとか。
↓から好きなものを選べば?
http://www.lispworks.com/documentation/HyperSpec/Front/index.htm
>>949
うーん、心当りがないなぁ。Linux とか商用なら希望を満たすのがあるの?
0954デフォルトの名無しさん
2007/06/05(火) 00:19:16レス、どうもありがとうございます。
linux上ではplplotはマウスイベントを取得できるドライバが使える
ようですので、clplotからplplotを呼び出したりすればできそうな気がします。
(結構手はかかりそうですけど)
あとcommon lispではないのですが、lushという処理系がありました。
これはマウスイベントを取得する描画ルーチンがありましたので、
自分でプロッターを作ることはできそうです。どうやらこの処理系は、
数値計算重視のようですね。Cのコードをはいたり、独自の拡張で
Cのコードを中に埋め込むことができるみたいです。
(しかし言語仕様はcommon lispとはかけ離れていますけど)
う〜む、なかなか難しいですね。
少しずつlispで使えそうなライブラリを作って、いずれ大体のことは
lispでできるようにトライしてみます。
0955デフォルトの名無しさん
2007/06/05(火) 00:48:47>>952
>>953
どうもありがとうございます。多値なんてありましたね。
とりあえずはオプショナル引数とバッククオート文法あたりですかね。
プログラマブルなリーダーは
普通のS式の構文解析の時点でヒーヒー言っているんで…
ちなみに何で Common Lisp 系と言うと
自分が一番使っている処理系が xyzzy だからです。
xyzzy ならその場で実行できるしソースも見れるしと。
とりあえず現在たらいまわし関数を実行してみたんですが、
(tak 10 5 0) が xyzzy が1秒ぐらいで終わるのに
自分の処理系だと20秒ぐらいかかって遅すぎ…
0956デフォルトの名無しさん
2007/06/05(火) 01:14:16S 式の構文解析でヒーヒーとか、 (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 が自作できるとの事なんで、ひょとすると見誤ってるかもしれないけど)
0957デフォルトの名無しさん
2007/06/05(火) 01:38:12実行系の設計に関するものに絞るとしても、とりあえず
signal/condition-case, catch/throw, block/return-from
くらいは必要でしょ。このへん無視すればそりゃ簡単だけど。
ほかには>>953が書いているようにリーダーとかマクロ回り。
0958デフォルトの名無しさん
2007/06/05(火) 02:12:42実は lisp C++ 共に経験はぜんぜん無いです。
まあ両方の勉強の為にやってるとも言えます。
だから実装効率は無視してクラスの設計を優先しました。
(だからって良い設計とはいえない気がするが)
ちなみに以前C#で作った処理系だと2〜3秒程度でした。
(クロージャなし、GCは.NETまかせ)
とりあえず遅い理由は cons をいちいち new しているのか
シンボルの束縛されている値と関数の取得が毎回
std::map<std::string, Symbol*>クラスの検索をしてるからっぽいですわ。
0959デフォルトの名無しさん
2007/06/05(火) 02:23:41あああ、制御系をすっかり忘れてました。
この辺ぜんぜん考えてなかった…
少なくとも block/return-from は無いと駄目じゃん…。
0960デフォルトの名無しさん
2007/06/05(火) 02:24:30そうだとすると、処理系製作するには Lisp の知識というかカンが不足してる気がする。普通の S 式はシンボルのツリーになるから
実行時に文字列からシンボルをいちいち引いたりしない。あと GC はどんな方式?
C# や C++ のテンプレートライブラリが使えるのに S 式の解析がつらいとか、技術レベルがちょっと
ちぐはぐな感じ。やる気はありそうだから、やっぱ作る対象もちゃんと勉強したほうがのびると思うよ。
いろんな言語で同じ水準の半端 Lisp を実装するより、まず腰を据えて Lisp に取り組むするほうがオヌヌメ。
0961デフォルトの名無しさん
2007/06/05(火) 02:42:57Symbol のクラスは std::string を持つだけのクラスで、
そのシンボルにどの値が束縛されているのかは
全体のテーブルから引く形になっています。
普通はSymbolに値と関数の領域を持たせるんですよね。
xyzzy のソース見てもそうなっていました。
GC はシンプルな Mark & Sweep で一応Cレベルのマシンスタックも走査しています。
この辺は Ruby のソースを見て参考にしました。
CG の最初と最後に printf しているのですが、
ぜんぜん時間はかかっていないみたいです。
S 式の解析は途中で継続可能(?)なのを作ったんですが、
この継続可能ってのが曲者でした。
説明しづらいですが、文字列をどこで切っても解析可能というか。
一段落したら Lisp の勉強をした方がよさそうですね。
0962デフォルトの名無しさん
2007/06/05(火) 02:43:030963デフォルトの名無しさん
2007/06/05(火) 02:51:52> シンボルの束縛されている値と関数の取得が毎回
> std::map<std::string, Symbol*>クラスの検索をしてるからっぽいですわ。
この辺が不思議。束縛をシンボルに入れるか外側に入れるかは、いろんな流儀があるけど、
どちらにしても文字列で検索するなんて話は出てこないはず。
ひょっとしてSymbolというクラスのインスタンスは同一文字列でも一つではないとか?
それって eq とか困らない?
0964デフォルトの名無しさん
2007/06/05(火) 02:58:14そうつっつかなくてもいいじゃん。
eqだってinternされてないシンボルというのがない(かつパッケージもない)
世界ならシンボルだけ特別扱い文字列比較でもいけるっちゃいけるんだし。
0965デフォルトの名無しさん
2007/06/05(火) 03:04:31eq と eql の区別がほどんど無意味になるけどね
0966デフォルトの名無しさん
2007/06/05(火) 03:06:49なんか、つっついてあげれば理解してくれる子だと思ったもんでつい・・・w
0967デフォルトの名無しさん
2007/06/05(火) 03:12:01C# でも Lisp 作った事あって、最低でもこれが 2 作目なんだよね。
xyzzy のソースまで読んでるのに Symbol の intern を知らないとか、
Ruby の GC を参考に、C スタックのスキャンまでできるのに?(プロファイルはprintfベース?)
S 式の解析が継続可能?作る対象の勉強が後回しとか、
うーんいまいち実力が見えないんだけど。ソースを見せてもらうのが一番はやそうだけど、そゆの抵抗がある人?
xyzzy だと Windows 系だろうから見せると減るって人が多いかなぁ。まぁ、順序を追ってやったほうがいいと思うけどねぇ。
0968デフォルトの名無しさん
2007/06/05(火) 06:46:45本人が「ソース読んだ」といってもそこに書いてあること全部読みとった
とは仮定しない方がいいと思うよ。本人の書く内容から推す経験値からしても。
なぜGCの知識はRuby由来かというと推測だけどおそらくRHGの存在によるんじゃない。
本人さんには現在実装しているサブセットの仕様を整理してもらって、
Lispをよく知っている住人は次にそれをどう拡張・変更するのがいいかって
お題を示してあげればいいんじゃないかなあ。
0969デフォルトの名無しさん
2007/06/05(火) 10:19:20(test)としても、The function test is undefined.になってしまいます。
なぜでしょうか?根本的に間違っていますか?
0970948
2007/06/06(水) 00:36:25std::map<Symbol*, 値>クラスの間違いでした。
構文解析の Symbol を作成する時に使うのと間違えてました。
>>963
Symbol インスタンスはプールしていて同じ文字列の場合は
以前作成したのを返却するようにしています。
>>964
実はinternもよく分かっていないんですよね。
Rubyや.NETなら文字列の値に対して一意に決まる値って感じだと思ってましたが。
>>967
別に抵抗は無いですが、匿名でいたいかなぁとかなんとか。
あぷろだであげればいいのかしら。
>>968
その通りRHGで見よう見真似(というかコピペ)です。
あとぐぐって出てきたのを拾い読みしてる感じですかね。
0971デフォルトの名無しさん
2007/06/06(水) 01:17:12> std::map<Symbol*, 値>クラスの間違いでした。
心配したほど酷い処理系じゃなさそうだな。w
非標準だけどhash_mapあたりを使えば速くなるかも。
0972デフォルトの名無しさん
2007/06/06(水) 07:45:44Load に失敗してるんじゃないの?としか言えない。load を実行したときのメッセージと
test.lsp の中身を見せてみて。
ecl の実行時カレントパスと test.lsp の置き場所がずれててロードできてないとかじゃないか。
>>970
あぷろだでいいと思うよ。
0973969
2007/06/06(水) 09:15:16ありがとうございます。
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.
0974969
2007/06/06(水) 12:35:20VC2005 Standard(Expressではなく)でビルドしたものになります。
rdnzlはサイト中にあるvc8対応の0.5ではなく、0.6.0を使用しています。
(一番最初のExamplesは動いたので)
0975デフォルトの名無しさん
2007/06/06(水) 18:30:06え〜っと、runさせる前にこれ実行してみたらどうだろう。
(in-package :rdnzl-user)
余談だけど0.9iはバグがあるのか、他のライブラリでも動かないことがあるね。
あと困ったことに、VC++は一つの配列で持てる文字列の大きさに制限があって、
eclで大きなファイルをコンパイルしようとすると、そのせいでコンパイル
できないことがある。ちゃんとコンパイルが通ったかは、注意した方がよさそう。
(gccにはそういった制限はなかったので、gccでコンパイルするって手もある)
VC++でそれを回避するには、compile-fileではなくて、compileで関数を
一つずつコンパイルすればいいのかもしれない。
0976974
2007/06/06(水) 19:34:48すばらしい!無事ロードし、実行できました。
(in-package :rdnzl-user)は、lispファイルの一番最初で実行されているので
不要かと思いました。
ご教示ありがとうございました。
0977デフォルトの名無しさん
2007/06/06(水) 21:19:09google の捨てあどとって google code とか
0978948
2007/06/07(木) 02:04:55http://deaikei.biz/up/
の 5673.zip です。パスは lisp で。
まだデバッグコードが入りまくってます。
スタイルは C#(というかMS系?)でやってます。よろぴく
0979デフォルトの名無しさん
2007/06/08(金) 23:23:19駄目もとでg++でコンパイルしたら、friend Hoge;はfriend class Hoge;でないとあかんやろーみたいなエラー出まくった。
後、std絡みのクラスの問題だと思うけど、例外系絡みぽいエラーが続発。
酔ってるので詳細はよくわからんし、調べもしてないけど。なんかデストラクタの宣言を指してエラーにされてる箇所もあった。
非MS系での報告ですまんが、万が一何かの役に立てば幸いですw
0980デフォルトの名無しさん
2007/06/10(日) 17:25:49コマンドの解析をしたいんだけど
cmd=print
data=hello
これをcmdがprintで
表示のデータがhello
というように解析したいのですが
0981デフォルトの名無しさん
2007/06/10(日) 20:19:37(data "hello")
とか書いてもらって、readで済ますのがLisp流
0982デフォルトの名無しさん
2007/06/10(日) 21:41:54【入門】Common Lisp その3【質問よろず】
http://pc11.2ch.net/test/read.cgi/tech/1181479267/l50
0983デフォルトの名無しさん
2007/06/10(日) 21:45:51乙
このスレが3スレ目まで行くとは凄いな
0984デフォルトの名無しさん
2007/06/12(火) 08:52:16(setf test #'(lambda () (format t "hello")))
(test)
みたいな感じのことをしたい.
gethashでデータと一緒に関数を入れておいて
maphashで取り出して実行みたいなことをしたい
なんか良く伝わってないかもしれないが、よろしくお願いします.
0985デフォルトの名無しさん
2007/06/12(火) 09:38:00(funcall test)
0986デフォルトの名無しさん
2007/06/12(火) 22:07:590987デフォルトの名無しさん
2007/06/12(火) 22:17:04ダサかろうが汚かろうが何の問題もありゃしません。
0988デフォルトの名無しさん
2007/06/12(火) 22:23:08その見解はlispには逆風だね
0989デフォルトの名無しさん
2007/06/12(火) 22:27:180990デフォルトの名無しさん
2007/06/12(火) 22:28:37スキマは巣へ
0991デフォルトの名無しさん
2007/06/12(火) 22:54:28lisperだお^^
0992デフォルトの名無しさん
2007/06/12(火) 23:17:33名前空間がわかれてないせいで kons とか lis とかって変数名になるのはカコイイのか?
関数呼び出しが (((generator))) とかなるのがカコイイのか?
構文の括弧なのか関数呼び出しなのかは構造みないとわからないのがカコイイのか?
実際に何段階呼び出すのかは *括弧を数えないと* わからないのがスマートなのか? (CL なら funcall 数えればすむ)
まぁ、好みの問題なんだけどさ…。
0993デフォルトの名無しさん
2007/06/13(水) 00:13:440994デフォルトの名無しさん
2007/06/13(水) 00:16:34普通に呼べる
0995デフォルトの名無しさん
2007/06/13(水) 00:17:30頭悪そうだな
0996デフォルトの名無しさん
2007/06/13(水) 00:20:12常に funcall 書かなきゃいけないのとたまに使うかも知れない関数と同名のシンボルとどっちを取った方がいいのか
cl のソースは funcall のせいで大分読みづらくなっていると思う
arc とかどうだったっけ?
0997デフォルトの名無しさん
2007/06/13(水) 00:25:18に思考が動くが funcall があると明示的で追いやすいという言い方もできる。
目くじらを立てるほど、どちらが良いとか、どちらがダサいとか言う問題ではないと思う。
なんか鬼の首でも取ったかのような>>986とその応援隊(?)が痛々しいよ。
0998デフォルトの名無しさん
2007/06/13(水) 00:40:02関数コールなんて見て一発で判るでしょ
逆にfuncallがあったほうが要素が多くなって追いにくくなるよ
前置記法なのにそこに関数がないんだから構造が変わってしまう
0999992
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)>)
1000デフォルトの名無しさん
2007/06/13(水) 00:48:58> 関数コールなんて見て一発で判るでしょ
ここに意見の相違があるわけ。俺は「常に一発でわかるとは限らない」と考えている。たとえば ((foo) ...) というコード片を見たとき、
Scheme だとその構造の一個上 (cond ... ((foo) ...) まで見ないと、cond の節かどうかその断片だけじゃわかんない。
CL スタイルなら ((funcall foo) ...) と cond の条件節みたいな構造の括弧 ((foo) ...) は一目瞭然。
funcall があったらそれは構造をあらわす括弧じゃなくて関数呼び出しの式という事がわかる。
これはコードを読む時に意識する範囲を狭める手助けとなる。少なくとも俺はね。
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。