5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

【入門】CommonLispその2【質問よろず】

1 :デフォルトの名無しさん:2006/02/15(水) 23:08:04
lispを触ってみたい入門者のQ&A
初心者のQ&A
本スレでは恥ずかしくて聞けない人のQ&A
本スレは高度すぎて割り込めない人のQ&A
linuxでなくてwindowsでやりたいんですが・・・Q&A
lispを使用してC#やJAVAの代替にするための方法(おまけ)

ま、ゆっくりたりましょう。

「いいものの本質は、いかなる時代においても変わらない」byパワーズ

前すれ
http://pc8.2ch.net/test/read.cgi/tech/1101386936/l50

2 :デフォルトの名無しさん:2006/02/15(水) 23:12:14
2 get

3 :デフォルトの名無しさん:2006/02/15(水) 23:14:07
/
/
3
/
/

4 :デフォルトの名無しさん:2006/02/15(水) 23:17:40


ポ

5 :デフォルトの名無しさん:2006/02/15(水) 23:38:12
((お勧めの Common Lisp 処理系)
(SBCL: http://sbcl.sourceforge.net/
   :プラットフォーム UNIX, Linux, Mac, Windows(移植中)
   :開発 活発
   :日本語 使える(UCS4, UTF8, EUC)
   :特徴 一番お勧めのコンパイラ。)

(CLISP: http://clisp.cons.org/
   :プラットフォーム UNIX, Linux, Mac, Windows
   :開発 そこそこ活発
   :日本語 使える
   :特徴 バーチャルマシン。遅いがフットプリントが小さい。)

(CMUCL: http://www.cons.org/cmucl/
   :プラットフォーム UNIX, Linux, Mac
   :開発 そこそこ活発
   :日本語 使えない(回避法有り)
   :特徴 高速コンパイラ。SBCL の元になった。)

(OpenMCL: http://openmcl.clozure.com/index.html
   :プラットフォーム PPC-Linux, Mac, x86-Linux と FreeBSD に移植中
   :開発 そこそこ活発
   :日本語 使えない
   :特徴 元々商用のコンパイラ。ネイティブスレッドが使える。))

6 :デフォルトの名無しさん: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 の直系。))

7 :デフォルトの名無しさん:2006/02/15(水) 23:53:03
ANSI Commn Lisp 仕様関係
http://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/

8 :デフォルトの名無しさん:2006/02/16(木) 00:15:33
(乙 >>1)

9 :デフォルトの名無しさん:2006/02/16(木) 00:16:35
現在の本スレ: Common Lisp, Scheme Part 14
http://pc8.2ch.net/test/read.cgi/tech/1132275726/

Schemer な人や、上級者 Lispnick はこちらへ。

10 :デフォルトの名無しさん: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 の 参考書を探しているならこれ一択))

11 :デフォルトの名無しさん:2006/02/16(木) 08:02:33
スレも改まったことだし、参考書にはPractical Common Lispも。


12 :デフォルトの名無しさん:2006/02/16(木) 15:04:56
PCL、すげーいいよ。

13 :デフォルトの名無しさん:2006/02/16(木) 18:38:00
あるディレクトリの拡張子が指定されたものであった場合に、条件に
合致する全てのファイルを削除するlisp式ってどう書きます?

前スレでも教えてもらったのだがABCLではどう書きます?

14 :デフォルトの名無しさん:2006/02/16(木) 19:12:18
>>13
(mapc #'delete-file (directory "/path/*.ext"))

15 :デフォルトの名無しさん:2006/02/16(木) 19:51:12
>>14
ありがとうございます
ここの人は優しいなァ

16 :デフォルトの名無しさん:2006/02/16(木) 21:27:11
>>12
同意。英語も平易だし。おまいら読め!

17 :デフォルトの名無しさん:2006/02/17(金) 01:00:12
質問です。floatのarrayに対してアクセスする度に(?)メモリを使っ
ていく様子なのですが、そういうもんなんでしょうか?

たとえば、arrayの中の与えられた要素の和を返す関数:
(defun foo1 (array positions)
(let ((sum 0.0))
(map nil #'(lambda (x) (setq sum (+ sum (aref array x)))) positions)
sum))
(compile 'foo1)
に対して float のarrayを以下のように作成します。
(setq sa1 (make-array 10 :element-type 'float
:initial-contents (loop for i from 1.0 to 10.0 by 1.0 collect i)))
すると、
(time (foo1 sa1 #(1 2 3 5 7)))
……
; space allocation:
; 3 cons cells, 80 other bytes, 0 static bytes
といった具合に「80 other bytes」が使われます。
これは定数ではなくアクセスする数が増えるに応じて16bytesずつ使われます。

一方で、integerの場合
(time (foo2 sa2 #(1 2 3 5 7)))
……
; 3 cons cells, 0 other bytes, 0 static bytes
となり 0 otehr bytes です。

大きなfloatのarrayを使いたいので何とかならないかなと思っているのですが…
処理系はAllegroを使っています。
どなたか情報お持ちの方教えてください。

18 :デフォルトの名無しさん:2006/02/17(金) 01:13:56
>>17
ガベジコレクタ様がよきに計らって下さるので、下々の者は気にしない、気にしない。

19 :17:2006/02/17(金) 01:30:53
たしかにメモリが足りなくなることはないのですが、
プログラムがやたら遅くなるので、やっぱなんとかならないかなと
思ってます。

ついでですが、>>17のfoo1は loop 〜 across 〜 summing を使った方
が見やすかったかもですね。
(個人的には loop は意味不明なのでなるたけ避けてる)


20 :デフォルトの名無しさん:2006/02/17(金) 01:48:21
array, sum あたりを declare するとマシになったりしない?

21 :17:2006/02/17(金) 03:07:06
>>20
(declare (type (array float (*)) array)) および (the (aref array x))
を入れてやってみましたが変わらずでした。

まさか、fixnum を越えるような値の場合は必ず一旦変換するのかなあ…


22 :デフォルトの名無しさん:2006/02/17(金) 03:08:07
>>21
失礼 (the float (aref array x)) です。

23 :デフォルトの名無しさん:2006/02/17(金) 03:12:27
>>17
integer でも fixnum を超える(most-positive-fixnum 以上になる)と
メモリ消費量が増えていくんじゃない? ACL は使った事無いけど...

24 :23:2006/02/17(金) 03:14:28
あ、出遅れた。ちなみに SBCL では fixnum 超えると integer でもメモリ使用量増えました。
optimize space とかも試してみたけど、ダメだった。

25 :17:2006/02/17(金) 03:44:41
>>24
Allgro でも同様でした。

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


26 :デフォルトの名無しさん:2006/02/17(金) 03:58:00
配列参照のほうじゃなく、sumに突っ込むときヒープにアロケートされてるとか。

27 :23:2006/02/17(金) 04:01:02
(+ sum (aref array x)) の終了時に一時的に値を保存してるのかもね。
SBCL の Compiler Note だと "<return value>" つーのが正体かな?

; (+ SUM (AREF ARRAY X))
;
; note: doing float to pointer coercion (cost 13) to "<return value>", for:
; the first result of inline float arithmetic

28 :23:2006/02/17(金) 04:02:30
う、毎回レスが被ってスマソ。

29 :デフォルトの名無しさん:2006/02/17(金) 04:28:44
lambda 式が map に値を返してるからじゃないの?
#'(lambda (x) (setq sum ...) (values)) だとどうよ。

30 :デフォルトの名無しさん:2006/02/17(金) 06:32:42
LispWorks だけど
(declare (optimize (speed 3) (space 0) (debug 0) (float 0)))
(declare (type (simple-array double-float (*)) array)
(type (simple-array fixnum (*)) positions)
...)
と do, svref に the double-float, the fixnum とか使って positions の要素数に
かかわらず Allocation = 16 bytes standard / 0 bytes conses まで最適化できた.
Allegro はしらんけど float って型じゃ意味なくね? double-float とか single-float
とか指定すべきでは.



31 :デフォルトの名無しさん:2006/02/17(金) 08:27:53
17じゃないけどACL8.0で>>30と同じようなことして16 other bytesまで
持って行った。けど間違った結果が返って来る罠(w
(declareに:explain仕掛けて真剣にコンパイラと向き合わないとダメだろね。きっと。

32 :デフォルトの名無しさん: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 してみよう。

33 :17:2006/02/17(金) 11:34:16
みなさんありがとうございます。
主に>>30,>>31を参考にして、
(defun foo3 (array positions)
(declare (optimize (speed 3) (space 0) (debug 0))
(type (simple-array single-float (*)) array))
(let ((sum 0.0)
(psize (1- (the fixnum (array-total-size positions)))))
(do ((i 0 (incf i)))
((> i psize))
(setq sum (+ (the single-float sum) (the single-float (aref array (the fixnum (aref positions i)))))))
sum))
を「AllegroCL8.0で」動かすと見事定数にできました。
# >>31 にあるような間違った結果はまだ確認できてないです

実はこれまでACL7.0を使ってたのですが、同じ関数でもACL7.0
ではうまくいきませんでした。

なんだかいろいろと勉強になりました。
特になんでもコンパイラ任せにしてたのを反省できたのが収穫でした。



34 :17:2006/02/17(金) 11:38:16
>>32
ありがとうございます。これまた勉強になりました。

# 俺>>33を30分かけて書いてたのか…


35 :17:2006/02/17(金) 12:26:17
何度もすいません。
改めて>>32をAllegroCL7.0で
(declare (optimize (speed 3) (space 0) (debug 0)))
で動かすと、これは(ACL8でなくとも)見事定数でした。

>>33で「ACL7だめじゃん」って思った俺がだめだめでした。



36 :30:2006/02/17(金) 22:30:44
>>31
すまん。 simple-vector と svref な。(simple-array と svref で debug 0, safety 0 じゃバグるって)
SBCL 0.9.9.31 と LispWorks 4.4.6 ともにコンス無しにできたよ。

37 :デフォルトの名無しさん:2006/02/18(土) 01:07:11
「ACL7だめじゃん」ってスゴイな。DuaneとかJohnが聞いたらどんな反応するだろか。
人づてに聞いた話では古参Lisper達は「コンパイルしたらコードがどう生成されるか」を
常に意識してS式を叩いていたそうな。
近頃の若いモンはなっとらんと叱られたけどそんな細かいところまでチューニングする
必要に駆られることあまり無いからね。やるにしてもプロファイラ使ってちゃんと
追い込んでいかないと要らんトコ最適化してたりするし。

38 :デフォルトの名無しさん:2006/02/18(土) 08:54:33
>>「コンパイルしたらコードがどう生成されるか」
Cプログラマでもやるよ。
おれはヘタレなスクリプト言語しか使えないけど…

39 :デフォルトの名無しさん:2006/02/18(土) 09:20:53
C→機械語とSEXP→機械語では後者の方が脳内変換コストがでかいと思う。


40 :デフォルトの名無しさん:2006/02/18(土) 14:03:54
>>39
でもLispならパターン決まっちゃえばあとはマクロで楽々だからな。
C++ のテンプレートとかも気分的には近いものはあるが。

41 :デフォルトの名無しさん:2006/02/18(土) 14:20:49
どうみても disassemble を使う方が脳内変換より確実です。本当にありがとうございます。

42 :10:2006/02/18(土) 23:58:36
)) ; 括弧閉じ忘れてた...

43 :デフォルトの名無しさん:2006/02/19(日) 01:27:12
>>42
長いリストになったねw

44 :デフォルトの名無しさん:2006/02/23(木) 01:17:12
ABCLでlispインタプリタにjavaのデータを渡す方法ってありますか?
lipsデータを取る方法は解ったんですが、渡す方法が解らないです。


45 :デフォルトの名無しさん:2006/02/23(木) 14:30:13
ひょっとしてabclではdefclassは出来てもdef-java-classみたいなことは
出来なかったりするのか?


46 :44:2006/02/23(木) 14:43:48
>def-java-classみたいなことは 出来なかったりするのか?

そりゃそうかも知れないな。
VMの上で動作するんだから、そこでclassファイルを動的には生成
できないよな。
となると動的ORMapperとか作れないということか、残念。

ちなみにここ参考になる
ttp://jroller.com/page/berlinbrown

47 :デフォルトの名無しさん:2006/02/24(金) 00:17:49
fu

48 :デフォルトの名無しさん:2006/02/26(日) 01:45:41
>5つの基本関数だけをもつ純LISPが挙げられる。
これの仕様ってわかりますか?

49 :デフォルトの名無しさん:2006/02/26(日) 01:49:14
必須なのは lambda だけ

50 :デフォルトの名無しさん:2006/02/26(日) 02:59:50
LISP初心者でよく分かんないんだけど、
John McCarthyの論文に書いてあるやつのことかな。
car, cdr, cons, cond, lambda? 他に必要なものあるかな。

http://www-formal.stanford.edu/jmc/recursive.pdf

51 :50:2006/02/26(日) 03:20:45
ここには「7つの基本命令」が挙げられてた。
PostScriptファイルの中に書いてあるけど、
quote, atom, eq, car, cdr, cons, cond
だそうな。でもそれだけじゃ物足りなくて、
関数定義をするためにlabelとlambdaが必要だとのこと。

http://www.paulgraham.com/rootsoflisp.html

52 :デフォルトの名無しさん:2006/02/26(日) 03:22:59
quote と atom って必須なのかな?

53 :デフォルトの名無しさん:2006/02/26(日) 03:26:46
>quote と atom って必須なのかな?
quoteのかわりにeqが要るらしい

http://ja.wikipedia.org/wiki/%E7%B4%94LISP

五つの基本関数とは、

1. car リストの左値をとり出す。(car[(A . B)] -> A)
2. cdr リストの右値をとり出す。(cdr[(A . B)] -> B)
3. cons 二つの値からなるリストを作る。(cons[A;B] -> (A . B))
4. atom 値がアトムならTを返す。(atom[(A B)] -> nil, atom[nil] -> T)
5. eq 二つの値が同じ物ならTを返す (eq[A;A] -> T)

以上が最小構成のLISPであり、理論上チューリングマシンと同等の能力を持つ。


54 :デフォルトの名無しさん:2006/02/26(日) 03:33:32
>>53
論文斜め読みした。5関数といくつかの天下りシンボル(NIL, T, LAMBDA, QUOTE)で
万能関数(要するにeval)がちゃんと定義できるよという感じか。

55 :デフォルトの名無しさん:2006/02/28(火) 05:15:45
SICPみたいに car, cdr, cons をlambdaで代用しても駄目?
lambdaは関数じゃないけど。

56 :デフォルトの名無しさん:2006/02/28(火) 05:42:26
マッカーシーのLispはダイナミックスコープだから

57 :デフォルトの名無しさん:2006/03/02(木) 04:04:59
質問させてください。
Emacsを使っていたのでいっちょlispを本格的に覚えようかと思い、
Debian(sarge)にapt-get install gclでGNU Common Lispを入れてみました。
が、gclで起動後、どうやったらtest.lspに書いたlispコードを実行してくれるのでしょうかが分からず困っています。
test.lspの中身は(+ 1 2)です。
ちなみにclispも入れてみたのですがclisp test.lspとすると、
WARNING: *FOREIGN-ENCODING*: reset to ASCIIというエラーが出るのですが、
こちらもお分かりになる方がいましたら合わせて教えていただけたらと思います。
お願いします。




58 :デフォルトの名無しさん:2006/03/02(木) 04:07:10
失礼しました。
>実行してくれるのでしょうかが分からず困っています。(誤)
実行してくれるのかが分からず困っています。(正)


59 :デフォルトの名無しさん:2006/03/02(木) 07:05:06
gcl ねぇ?使ったことないけど gcl -load test.lisp もしくは起動後に

> (load "test.lisp")

かね.clisp のエラーは,たぶん使ってる環境の文字コード設定が
clisp に理解できてない.iconv がリンクされてないか,環境の設定が
おかしいか.とりあえず clisp -Eforeign 1:1 とでもすればいくない?
clisp -Eforeign ascii test.lisp でもいいかも


60 :57:2006/03/02(木) 22:42:31
>59さん
レスありがとうございます。

>(load "bin/test.lsp")

Loading bin/test.lsp
Finished loading bin/test.lsp
T

となりました。
どうやらこれで読み込みは出来たという事みたいですが、
実行結果を出力するにはこれだけでは足りないのでしょうか。

clispは相変わらず以前と同じエラーが出ています。
エンコード設定はEUC-JPです。
システム自体のエンコードも、ファイルのエンコードも同じです。
ひょっとしてclispはEUC-JPは使えないのでしょうか。
何かおかしいと思って、test.lspの中身を
(+ 1 2 3)から(print (+ 1 2 3)としたら
clispでもgclでも以下の様に実行する事が出来ました。

[1]> (load "bin/test.lsp")
;; Loading file test.lsp ...
6
;; Loaded file test.lsp
T

しかし相変わらずclisp test.lspで一気に実行結果出力は出来ませんでしたが、
実行する事は出来ました。
ありがとうございます。
何やらshやphp等とは全く違う感じですね。
こんな初心者ですがこれからもよろしくです。

61 :デフォルトの名無しさん:2006/03/02(木) 23:45:24
つうか sh でも php でも計算結果を表示しようと思ったら echo なり print
なりするでしょ?表示っつー機能が必要.

CLISP は適切な libiconv がリンクされていれば EUC-JP は使える.が,どう
も貴方のお使いの CLISP は他言語サポートが入ってないんじゃないかという気
がしてきた.

(format t "~{~A~&~}" (list (lisp-implementation-version) *features*))

こんな一行のファイルを foo.lisp とでも保存して,clisp foo.lisp で結果を
張り付けてくれ.あと,できればプロンプトで (load "bin/test.lsp") と操作
できるなら,euc サポートが含まれているか確認してみて.

[1]> charset:euc-jp
#<encoding "EUC-JP" :unix>
[2]>

上記は私の環境での結果です.EUC も UTF-8 も SHIFT-JIS も使えてるよ.

62 :57:2006/03/03(金) 00:23:16
[1]> (load "foo.lisp")
;; Loading file foo.lisp ...2.33.2 (2004-06-02) (built 3318073317) (memory 3350292839)
(ASDF SYSCALLS CLX-ANSI-COMMON-LISP CLX REGEXP CLOS LOOP COMPILER CLISP ANSI-CL COMMON-LISP LISP=CL
INTERPRETER SOCKETS GENERIC-STREAMS LOGICAL-PATHNAMES SCREEN FFI GETTEXT UNICODE
BASE-CHAR=CHARACTER PC386 UNIX)
;; Loaded file foo.lisp
T
[2]> charset:euc-jp
#<ENCODING "EUC-JP" :UNIX>

です。
どうでしょう。

>つうか sh でも php でも計算結果を表示しようと思ったら
なるほど。確かにそうですね...

63 :デフォルトの名無しさん:2006/03/03(金) 01:02:04
2.33 かぁ.結構古いなぁ….でも unicode サポートも euc-jp エンコーディングも
入ってるね.ASDF が入ってるところをみると,誰かが設定済みなのかな.

WARNING: *FOREIGN-ENCODING*: reset to ASCII

これはエラーじゃなくて警告ね.FFI とか C とのやりとで使うエンコーディン
グが ASCII コンパチじゃないといっている.

clisp -Eforeign iso-8859-1

のような ASCII コンパチの encoding を指定すれば消えるんじゃないかな.もっ
と新しいバージョンだと clisp -Eforeign 1:1 とかいけるんだけど.


64 :57:2006/03/03(金) 02:09:57
細かいところまでありがとうございます。
中々難しいかもしれないけどがんばってみます。
clisp立ち上げずに下記をたたいてみたら、
clisp -Eforeign euc-jp lisp/test.lsp
WARNING: *FOREIGN-ENCODING*: reset to ASCII

6
と、相変わらずワーニングは出るけど結果は出力されました。
clisp lisp/test.lsp
WARNING: *FOREIGN-ENCODING*: reset to ASCII

6
とやっても同じのようですね。
>ASCII コンパチの encoding を指定すれば消えるんじゃないかな
この辺キーワードにして調べてみます。
ありがとうです。


65 :デフォルトの名無しさん:2006/03/03(金) 02:22:27
あー誤解があるようですね.*FOREIGN-ENCODING* は「C の共有ライブラリを直
接呼び出す機能 (Foreign-Function Interface)」で使うエンコーディングを指
定しますが,通常ここはバイト列として扱いたい ( C のライブラリでは画像
データなど文字以外も扱えるので)なんで日本語のエンコーディング指定しちゃ
ダメです.バイト列として扱うために,あえて

clisp -Eforeign iso-8859-1

のように指定します.端末やファイルのエンコーディングの指定とは別の指定
なので,このように指定したかといって日本語が使えなくなるとかそーゆう事
はありません.むしろ,ここで euc-jp を指定しているから WARNING が出てい
るんです.上記のように iso-8859-1 を指定すれば治ると思いますよ.


66 :デフォルトの名無しさん:2006/03/03(金) 02:48:58
バイト列を扱いたいなら unsigned-byte を使えばいい。
国際化されたライブラリを呼び出す場合、EUC-JP に setlocale されてる環境
で文字を ISO-8859-1 にエンコードして渡すとかえっておかしくなるよ。
>>57 の環境で warning が出るのは 2.33 以前では FFI にマルチバイトエンコー
ディングを使えなかったから。

NEWS:
2.34 (2005-07-20)
* The FFI variable FFI:*FOREIGN-ENCODING* can now be a multibyte encoding.
The warning "*FOREIGN-ENCODING*: reset to ASCII" at startup is gone.

67 :57:2006/03/03(金) 13:10:21
!誤解していたようですね...
なるほど。
という事でやってみました。

$ clisp -Eforeign iso-8859-1 lisp/test.lsp
6

出来ました。
ありがとうございます。
ついでに以下もやってみました。
$ clisp -Eforeign unicode lisp/test.lsp
WARNING: *FOREIGN-ENCODING*: no encoding UNICODE, using ASCII
6
$ clisp -Eforeign ascii lisp/test.lsp
6
将来的にはCLOS(でしたっけ?)を使えばサーバアプリを(多分)書けるとの事なので、
やってみたいですね。
ひょっとしてclisp 2.33より上ならば何も問題無いのかな。
だとしたら本家からDLして持ってきたら良いのかな?
とちその辺も含めて色々とやってみます。
どうもありがとう。

68 :デフォルトの名無しさん:2006/03/18(土) 22:55:36
保守ついでに本スレより転載。.exe が出力できるそうですよ!!

> MSN サーチで "CLISP Win32 日本語" って検索したら libiconv を
> リンクした Windows 用の CLISP バイナリみつけた。
> http://lispuser.net/commonlisp/clisp.html


69 :デフォルトの名無しさん:2006/03/18(土) 23:18:02
キタこれ
CLISP最強伝説の幕開けか?

70 :デフォルトの名無しさん:2006/03/18(土) 23:26:56
ネイティブコードに拘らない(中間言語インタプリタでよい)のならCLISPはなかなか
バランスの良い処理系だと思う。インタプリタの速度なら結構良い勝負するし。

71 :デフォルトの名無しさん:2006/03/18(土) 23:41:31
>>69
もちつけ。CLISP じゃ伝説はむりだろ。まぁ起動時にエンコーディングまわり
の警告がでないという点は初心者向けには良いのではないだろうか。


72 :デフォルトの名無しさん:2006/04/07(金) 11:06:48
すまん、LISP初心者つーか何もよくわかってないんだが、Cとかと同違うと?
下のようなコードはLISPだと根本的に書き方がちがくなるのか?
{
FileOpenDialog fdlg=new FileOpenDialog();
RESULT res=fdlg.DoOpen();
if(res==OK){
Files files=fdlg.SelectedFiles;
FileSystem.CopyFiles(files);
}
}
神様よろ。

73 :デフォルトの名無しさん:2006/04/07(金) 11:07:29
インデントがうまくいかねぇ
{
FileOpenDialog fdlg=new FileOpenDialog();
RESULT res=fdlg.DoOpen();
if(res==OK){
Files files=fdlg.SelectedFiles;
FileSystem.CopyFiles(files);
}
}

74 :デフォルトの名無しさん:2006/04/07(金) 14:50:01
「根本的」の定義次第だが、おそらく君の考えている意味では違わないだろう。

75 :デフォルトの名無しさん:2006/04/07(金) 22:06:08
>>72
括弧の位置が変わるくらいじゃないかな?
慣れればその違いも気にならなくなると思うよ。

基本的には

object.method(arg);

ってのが

(method object arg)

になるって感じ。

76 :デフォルトの名無しさん:2006/04/07(金) 22:50:12
マクロにして
(with-file-open-dialog (files) (file-system-copy-files files))
とか

77 :デフォルトの名無しさん:2006/04/12(水) 23:36:46
lispの使えるレンタルサーバーって、ありますか???

78 :デフォルトの名無しさん:2006/04/12(水) 23:49:48
>>77
サクラインターネットとか?
使えるつーか、コンパイル環境あるからgaucheとか入れれるよ

79 :77:2006/04/13(木) 08:12:36
>>78
thx。 手掛りをありがとう!!

80 :デフォルトの名無しさん:2006/04/15(土) 00:52:12
ほす

81 :デフォルトの名無しさん:2006/04/17(月) 02:09:22
既出でしたらすみません。

最近,SchemeでSchemeのコンパイラを作ってみたいなと思っています。具体的にはSchemeのコードをネイティブなマシンコードへコンパイルしてみたいと考えています。そのためにはどのような本を読めばいいのでしょうか?

82 :デフォルトの名無しさん:2006/04/17(月) 02:16:18
>>81
君の知識、得意分野、アイデアをもうちょっと晒してもらわんとなんともはや。
少なくとも「サルでも作れるSchemeコンパイラ」のような本は無いと思う。w

83 :デフォルトの名無しさん:2006/04/17(月) 02:37:58
>>82
すみませんでした。

処理系はGaucheを使っていて日常の雑務を行うプログラムを組んだりライブラリを使ったりできます。また継続やマクロを使ってプログラムを組めます。BNFで書かれた仕様も読んだり書いたりできます。

わからないのは,どうやって読み込んだS式を効率良い形に変換し,マシンコードへ変換するかというところと,アセンブラです。アセンブラはCASLでやっただけです。

84 :デフォルトの名無しさん:2006/04/17(月) 03:37:48
>どうやって読み込んだS式を効率良い形に変換し,マシンコードへ変換するか

これは俺も知りたい。多分、論文嫁って事になると思うけど。
ま、最初は↓こんなところを見ながら当りを付けて行くのが
良いかと。

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/

85 :デフォルトの名無しさん:2006/04/17(月) 03:41:02
Scheme は言語仕様が小さいから、、、ってよく聞くけど、GC もあるし継続もあるし、
コンパイラ作りたい初心者に向いてる言語じゃない様な気がする。

86 :デフォルトの名無しさん:2006/04/17(月) 09:04:41
GCはともかく継続はなあ。

87 :デフォルトの名無しさん:2006/04/17(月) 11:43:01
>>84
ありがとうございます!
さっそく読んでみます。





88 :デフォルトの名無しさん:2006/04/17(月) 23:11:42
あっ ここ消えてる。
http://www.is.s.u-tokyo.ac.jp/~vu/97/jugyo/processor/compilerresume/


89 :デフォルトの名無しさん: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

90 :デフォルトの名無しさん:2006/04/18(火) 22:21:55
と思ったが、一応 web.archive.org から一式拾っておいた。

91 :デフォルトの名無しさん:2006/04/23(日) 02:47:47
incrementalなgcでソースの読みやすいものってある?


92 :デフォルトの名無しさん:2006/04/23(日) 02:59:14
Matz?

というのは冗談としても、わざわざインクリメンタル GC を実装している
処理系自体少なそうだね。

93 :デフォルトの名無しさん:2006/04/23(日) 20:08:52
IoだったかLuaだったかがやってたような気がする。
tricolor schemeをそのままコードにしたようなものでわかりやすい
と思った。いわゆるlightweight系な言語だったのは覚えてるんだが
どの言語だったかはっきり覚えてない。すまん。


94 :デフォルトの名無しさん:2006/04/30(日) 22:05:55
甘えてすまそ
SBCL-0.9.12にWINDOWSのバイナリーがあったので
落としてきたのだけど、インストールマニュアルを見ても
起動しない・・・
sbcl-0.9.12-x86-win32\src\runtime にパスを通して
SBCL --core sbcl.core で起動しても当然coreが見つからんし
英語読解力不足を棚に上げて悪いけど助けて!


95 :デフォルトの名無しさん:2006/05/01(月) 00:38:44
sbcl-0.9.12-x86-win32 を基準に
src\runtime\sbcl.exe --core output\sbcl.core
で起動するよ。

Windows で SLIME 使いたいならちょっと前にでてた
http://lispuser.net/commonlisp/clisp.html
が一番てっとりばやいと思われ。SBCL on Win32 はまだ罠大杉・・・

96 :デフォルトの名無しさん:2006/05/01(月) 07:54:36
SBCL on Win32はまだ、SBCLそのものをいじりたい人しかおすすめできないなあ。


97 :& ◆D3ra0B2LiQ :2006/05/01(月) 08:44:53
>>95 96
ありがとう動いたよ!
SBCL ON Win32がまだまだなのはわかってるんだけど
あの爆速を体験すると触りたくなるのよね。
WinでLisp & Schemeとなると選択肢減るし、
普段が Petite Chez だからスピードに憧れるのよね。

98 :デフォルトの名無しさん:2006/05/04(木) 04:49:34
OpenMCL は Solaris にも porting されるみたいね。
SBCL のスレッド回りも急激に進展してるようで、非常に wktk.

99 :デフォルトの名無しさん:2006/05/06(土) 16:24:41
すみません。
lispってCommon LispとかSchemeとかいろいろあるみたいですが、
何が違うのでしょうか?

100 :デフォルトの名無しさん:2006/05/06(土) 16:50:31
名前

101 :デフォルトの名無しさん:2006/05/06(土) 17:32:27
>>99
C と C++ みたいな違い。

102 :デフォルトの名無しさん:2006/05/06(土) 17:40:01
JavaとC#くらい違ってるし、JavaとC#くらい似ている。

103 :デフォルトの名無しさん:2006/05/07(日) 02:03:35
[Common Lisp の歴史]
Lisp (1950年代) 誕生 -> MacLisp, InterLisp とかイロイロ乱立 -> ベンダーが集って Common Lisp で規格化 (1984)

商用ベンダが集まっただけあってコンパイラを意識した規格になっている。ロー
ド,リード,コンパイル,評価時などを意識しているし,型システムについて
も決まってる。パッケージやオブジェクトシステム,デバッガやプロファイラ
なども規格に入ってる。

で,それとは別の流れとして 1970 年代に高名な Lisper が提唱して大学とか
情報科学の分野で進化してきたのが Scheme。こっちはミニマリスト的な考えに
基づいている。そんかわりコンパイラやパッケージ,型の取り扱い,オブジェ
クトシステムなどが規格に入ってない。末尾再帰の最適化や継続など Common
Lisp には無い機能が入ってたりする。


104 :デフォルトの名無しさん:2006/05/09(火) 09:48:27
Linux かWin 上の
Clisp でグラフィックとかGUIやりたいんですけど
何をどうすればいいのでしょうか。
GNUPLOTに書かせるのはとあるサイトにあったので
それはやってみました。


105 :デフォルトの名無しさん:2006/05/09(火) 17:54:54
まず以下の作業をやってみたら?
Swingでguiプログラムを書く。
次にそのプログラムを書くlispプログラムを書く。
マクロ使いまくってコードの長さを半分以下にする。

106 :デフォルトの名無しさん:2006/05/10(水) 00:55:09
派手なアニメーションしなければ Ltk でいいんじゃね
http://lispuser.net/memo/lisp/2006-02-25-23-57.html

OpenGL とか使いたいたいとかだとあんま C とかわんないなぁ…むしろ C の知
識が必要になる。


107 :デフォルトの名無しさん:2006/05/11(木) 03:42:22
どうもです。
LTKを使うのがわりとやりたかったことっぽいようです。
ありがとうございました。

108 :デフォルトの名無しさん:2006/06/12(月) 18:07:45
ほす
ラムダっちゃ

109 :デフォルトの名無しさん:2006/06/13(火) 00:35:06
>>108のセンスに脱帽

110 :デフォルトの名無しさん:2006/06/19(月) 21:24:34
空ageしとこう
ラ無駄無駄無駄無駄無駄無駄無駄無駄ァーーー!

111 :デフォルトの名無しさん:2006/06/27(火) 07:07:57
自分で定義した関数の関数定義を調べる関数は有りませんか?

例えば、fac という関数を定義されていたとして、
(show-definition #'fac)
とすると、
引数 n と、
定義 (if (= n 1) 1 (* n (fac (1- n))) 等が
帰ってくる、show-definition みたいなものを探しています。

112 :デフォルトの名無しさん:2006/06/27(火) 07:12:00
find の関数は列から一致した要素を返しますが、
元の列から一致した要素以降の列を返す関数はないですか?

113 :デフォルトの名無しさん:2006/06/27(火) 08:56:04
>>112
member?

114 :デフォルトの名無しさん:2006/06/27(火) 11:39:45
>>111
function-lambda-expression

115 :デフォルトの名無しさん:2006/06/29(木) 05:29:35
>>114 ありがとです。

関数の定義を受け取って、
ある種の構文解析をするツールを作ってたのですが、
(parse-function '(defun fac (n) ...))
ってするのはあまりに面倒なので、
(parse-function #'fac)
と、したかったのでした。

116 :デフォルトの名無しさん:2006/06/29(木) 05:38:24
>>113 ありがとです。
周囲に LISP を使う人がいないので簡単な事もなかなか分かりません。

>>115 で出力する際に構文要素がだぶって出力されるのを抑えるために Unix の uniq -d コマンドと同等の関数が欲しかったのですが、
copy-tree のアルゴリズムを応用して作成しました。その際に
(member item list :test (complement pred))
みたいな関数があるとすぐに書けるな〜。って思った訳です。

ちなみに、 uniq -d みたいな関数もしくはそれを実現出来る関数はありますか?


117 :デフォルトの名無しさん:2006/07/01(土) 01:13:26
ずっと前に誰かが言って気になっていたことなのですが、
「Lispと言えば今でも現場で画像処理なんかに使われている。」
って言葉がひっかかっています。

Lisp = 型宣言が不要でリスト処理が簡単にできる、
っていう程度の理解しかないからかも知れないのですが、
「リスト処理が得意 => 画像処理が得意」という短絡な答えではないですよね?

Lispと画像処理を結びつけた解説や記事はありませんか?


118 :デフォルトの名無しさん:2006/07/01(土) 01:24:29
画像処理とはちょっと違うが、CGといえばシンボリックス(LISPマシン)という時代があった

119 :デフォルトの名無しさん:2006/07/01(土) 02:36:56
>>117
こちら辺りで如何? 微妙に古いけれど。
http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Lisp%3aGeometry
http://www.gamasutra.com/features/19991112/GavinWhite_03.htm

120 :デフォルトの名無しさん:2006/07/08(土) 19:30:48
今、LispのインタプリタをCで書いてるんですが、
お勧めの本とかありますか?

あとLispのメーリングリストってないんでしょうか?
探しても見当たらないんですが...

121 :デフォルトの名無しさん:2006/07/08(土) 21:30:04
awklisp

122 :デフォルトの名無しさん:2006/07/10(月) 21:15:26
lisperならここを読んどけっていうblogあったら教せーて。
とりあえず Planet Lisp と shiro さんとこは読んでます。


123 :デフォルトの名無しさん:2006/07/10(月) 21:23:44
blog じゃないけど comp.lang.lisp と meme.b9.com/start.html はたまに見てる。

124 :デフォルトの名無しさん:2006/07/12(水) 04:56:06
>>123
さんくす。とりあえず comp.lang.lisp 読んでみるわ。
あと、deliciasとかはてブのlispタグあたりから面白そうなものを
書いているとこ探してみます。

125 :デフォルトの名無しさん:2006/07/12(水) 10:51:19
おもしろそうなところ発見したら報告よろ。

126 :デフォルトの名無しさん:2006/07/16(日) 08:05:50
(format t "...") で、" を出力するにはどうするのでしょうか?

127 :デフォルトの名無しさん:2006/07/16(日) 09:36:40
>>126
こういうこと?
(format t "\"")

128 :デフォルトの名無しさん:2006/07/16(日) 11:34:51
>>127 そゆことです。さんくす。

129 :デフォルトの名無しさん:2006/07/28(金) 03:17:57
+ - * / 等の ANSI SPEC サポート関数のオーバーロードの方法を知りたいのですが。
例えば、+ を計算しつつ演算が全計算中で何回行われたか等を
my_add みたいな関数を定義する事なしにカウントしたいのですが、
どうすればいいのでしょうか?

130 :デフォルトの名無しさん:2006/07/28(金) 22:50:07
普通の関数を再定義するのと変わらんと思うが。


131 :デフォルトの名無しさん:2006/07/29(土) 19:20:48
>>130
再定義じゃなくてオーバーロード

132 :デフォルトの名無しさん:2006/07/29(土) 19:40:44
こういうのって合法なの?
(let ((old #'+))
(defun + (&rest numbers)
(message (format nil "~S" numbers))
(apply old numbers))
)

133 :デフォルトの名無しさん:2006/07/30(日) 03:20:54
132の言ってる[合法]ってのが何のルールに対してなのかわからないけど
まともな処理系でcommon-lispパッケージで定義されてるものを再定義しようとすると
警告なりなんなりが出るとおもう。参考までにACLでやるとこんな感じ↓


Error: Attempt to make a function definition for the name +.
This name is in the common-lisp package and redefining it is a violation for portable programs.
Replacing the current definition of #<Function +> may be dangerous.
The package common-lisp has package-definition-lock set, which causes the system to signal this violation.
[condition type: package-locked-error]

関係ないけどファンクションのオーバーロードなんてできないよね?再定義だよね?
ジェネリックファンクションじゃないんだから。131の意見をもっと詳しく聞きたい。


134 :131:2006/07/30(日) 11:19:05
>>133
俺はSchemeの人なのでCommonLispはさっぱりわからん。
(Schemeもそれほど使いこなせてないけど。)
通りすがりに>>130の回答が的外れに思えたので言ってみただけ。

135 :デフォルトの名無しさん:2006/07/31(月) 22:30:49
130の回答がすべてだと思う。

136 :デフォルトの名無しさん:2006/08/13(日) 01:15:32
λ...
λ...
λ...

137 :デフォルトの名無しさん:2006/08/18(金) 09:46:52
javaのムスタングというバージョンにはスクリプトをVM上で実行できる
機能がつくらしいが、lispを動かすことはできるのだろうか??

138 :デフォルトの名無しさん:2006/08/18(金) 11:06:49
できる

139 :デフォルトの名無しさん:2006/08/18(金) 23:54:41
今でも ABCL とか、JVM 上で動く Lisp はあるけどね。

140 :デフォルトの名無しさん:2006/08/19(土) 02:58:47
>>139
アレ重すぎる。面白そうだから少し使ってみたけど
weblogicと同じくらいメモリを消費するってのがちょっと・・・

141 :デフォルトの名無しさん:2006/08/19(土) 11:59:48
WebLogic と同じくらいとかゆわれてもピンとこないなー。それは例えば他の
JVM で動作するスクリプトと比較してどうなの?まぁ、大抵のスクリプト言語
はインタプリタだろうからその分は差し引かないといけなさそうだけど


142 :デフォルトの名無しさん:2006/08/20(日) 00:37:54
@で紹介されてたやつ?
もしlispが動く処理系がJVMに組み込まれたとして、何が出来るだろう?
ぱっと思いつくところとしてオブジェクト全部javaで切って置いて、
外部ファイルにlispでアプリの動作を定義するというDIみたいなものだろうか。

rhinoみたいにjavaで書かれていてなおかつ手軽にlispで遊べるtoolないもんかな〜〜

143 :デフォルトの名無しさん:2006/08/20(日) 22:34:47
>>141
ABCL を動かしてみた。起動時のメモリ使用量は
Rhino: 10MB
ABCL : 20MB
だった。重すぎるかねぇ?



144 :デフォルトの名無しさん:2006/08/20(日) 22:35:55
>>143
今どき目くじらを立てるほどではないと思う

145 :デフォルトの名無しさん:2006/09/20(水) 18:27:21
Common Lispを勉強中なのですがどうしても理解できない部分があります。
(1 2 3)などと入力した場合エラーになるのに
(defun hoge (p) p)という関数を定義して
(hoge (list 1 2 3))などとした場合エラーにならないのはなぜなんでしょうか?
関数の本体が実行される前に引数が評価されてp イコール (1 2 3)になるのなら
エラーになると思うんですが・・

146 :デフォルトの名無しさん:2006/09/20(水) 18:50:03
>>145
(1 2 3) と (list 1 2 3) は違う。後者を評価したものが前者になる。
言い方を変えると前者はデータ、後者はプログラム(=評価される式)。
プログラムを書くべき場所にデータを書けば当然プログラムとして評価される。
つまり 1 という関数を呼び出してエラーになる。

147 :145:2006/09/20(水) 19:31:10
うーん 難しい・・
もし(defun hoge (a)(+ a 1))という関数を定義したとして
(hoge (+ 1 2))という風に呼び出すとすると
関数の本体が実行される前にまず(+ 1 2)の部分が評価されて3になりますよね。
その後3がaに結び付けられて関数の本体(+ 3 1)が評価されて4を返すと思うんですが
145の例だと関数の本体の部分のpが評価される前に引数の(list 1 2 3)が評価されて
(1 2 3)になった後(1 2 3)がpに結び付けられて関数の本体の部分のpつまり
(1 2 3)が評価されるならやはりエラー になるはずなのにならないのがまだ理解できないです。

148 :デフォルトの名無しさん:2006/09/20(水) 19:48:27
>>147
(1 2 3) が評価されるわけじゃなくて p が (1 2 3) にバインドされている状態で p が評価
される。その結果の値は (1 2 3) になる。

149 :145:2006/09/20(水) 19:54:07
あっ つまりバインドするというのはpという箱に(1 2 3)を入れるのではなくて
(1 2 3)がある部分をpが指し示すようにするってことなんですね。
やっとわかりました。ありがとうございます。

150 :デフォルトの名無しさん:2006/09/21(木) 02:02:39
(1 2 3)  =>  "1" と言う名前の関数として評価 => エラー

(list 1 2 3) => "list" 関数として評価 => リストオブジェクト

'(1 2 3) == (quote (1 2 3)) => (1 2 3) を評価せずそのままオブジェクトとして返す => リストオブジェクト


151 :デフォルトの名無しさん:2006/09/22(金) 05:46:30
>>146
| 言い方を変えると前者はデータ、後者はプログラム(=評価される式)。
は変に感じるな。両方ともデータだし、同時にプログラムでもある。
ただ前者は「正しくない」プログラムだけど。>>150 の表記は気持ち悪いねぇ…
オレだけか(w


152 :デフォルトの名無しさん:2006/09/22(金) 12:27:10
>>151
揚げ足取りと言われたくないなら、>>145レベルの人のために君の的確な説明を書き込もう

153 :デフォルトの名無しさん:2006/09/22(金) 22:08:54
'(a b 1 2) っていう表記に、自分の中でしっくり来ないものを感じたから、考えた。

(class-of (car '(a b c)))
#<BUILT-IN-CLASS SYMBOL>
(class-of (car '(1 2 3)))
#<BUILT-IN-CLASS FIXNUM>

alphabetの方は解かるんだけど、数字の方が`1'っていうsymbolじゃなくて、
なんで数値型になるのかが自分には引っかかるみたい。で、下の物を評価してみた。

(class-of (quote 1))
#<BUILT-IN-CLASS FIXNUM>

数字って、quoteしても、無視なんですね。知りませんでした。
↓こうしたら、symbolにできた。
(class-of (quote |1|))
#<BUILT-IN-CLASS SYMBOL>

;;↓あと、ためした物
(class-of (quote .1))
#<BUILT-IN-CLASS SINGLE-FLOAT>
(class-of (quote 1/2))
#<BUILT-IN-CLASS RATIO>
(class-of (quote #C(1 3)))
#<BUILT-IN-CLASS COMPLEX>
(class-of (quote #*010))
#<BUILT-IN-CLASS SIMPLE-BIT-VECTOR>

;; lisp expertのかた、この程度ですんません。


154 :デフォルトの名無しさん:2006/09/22(金) 22:22:50
>>153
(class-of '1a)
(class-of '1e)
(class-of '1e1)
なんてのも面白いぞ。
要するに数値として解釈できるものは数値になる。

155 :デフォルトの名無しさん:2006/09/23(土) 00:53:39
竹内郁雄先生の初めての人のためにLISPを読んで勉強中なんですが
マクロの所でどうしてもわからないところがあります。
162pでcondを

(defmacro mycond (&rest clauses)
(expand-cond clauses))

(defun expand-cond (clauses)
(mycond ((null clauses) nil)
((eq (caar clauses) 't)
(cons 'progn (cdar clauses)) )
(t (list 'if
(caar clauses)
(cons 'progn (cdar clauses))
(expand-cond (cdr clauses )) ))))

と定義しているのですが、マクロcondのなかでexpand-condを評価し、
そのexpand-condのなかでまたマクロcondを評価してまたそのなかでexpand-condを・・・
という風に評価のループ状態になってしまうのではないでしょうか?
(実際xyzzyで試してみたらスタックフローオーバーになりました



156 :デフォルトの名無しさん:2006/09/23(土) 00:59:18
>>155
expand-condの定義でmycondを使うのはまずいな。
condを使うか、ifか何かで書き換えるかするよろし。

157 :デフォルトの名無しさん:2006/09/23(土) 01:00:34
なぜか空白が表示されなかったorz

(defmacro mycond (&rest clauses)
(expand-cond clauses))

(defun expand-cond (clauses)
(mycond ((null clauses) nil)
((eq (caar clauses) 't)
(cons 'progn (cdar clauses)) )
(t (list 'if
(caar clauses)
(cons 'progn (cdar clauses))
(expand-cond (cdr clauses )) ))))

158 :デフォルトの名無しさん:2006/09/23(土) 01:12:28
何度もすんませんorz

>>156
つまりexpand-condのなかでは自分で定義したmycondを使うのではなく言語に
もとから実装されているcondを使う、ということなんでしょうか?


(defmacro mycond (&rest clauses)
 (expand-cond clauses))

(defun expand-cond (clauses)
  (mycond ((null clauses) nil)
      ((eq (caar clauses) 't)
       (cons 'progn (cdar clauses)) )
      (t (list 'if
           (caar clauses)
           (cons 'progn (cdar clauses))
           (expand-cond (cdr clauses )) ))))

159 :デフォルトの名無しさん:2006/09/23(土) 01:19:53
>>158
yes

160 :158:2006/09/23(土) 01:25:09
>>119
うーん・・本に書いてある例↓だと158の例のmycondになってる部分(マクロの定義でもexpand-condの中のでも)
condになっているんですがこれは本のプログラムが間違ってるということなんでしょうか?

(defmacro cond (&rest clauses)
 (expand-cond clauses))

(defun expand-cond (clauses)
  (cond ((null clauses) nil)
      ((eq (caar clauses) 't)
       (cons 'progn (cdar clauses)) )
      (t (list 'if
           (caar clauses)
           (cons 'progn (cdar clauses))
           (expand-cond (cdr clauses )) ))))

161 :デフォルトの名無しさん:2006/09/23(土) 01:56:19
>>160
「初めての人のためのLISP」、書庫から探してきた。162ページだよね。

えっと、condのような特殊形式はマクロで再定義してはならないことになっているんですわ。
だから竹内本の例はCommon Lispとしてはcondをマクロとして定義している時点で正しくない
ということになる。(本の中のプログラムは正確な例ではなく概念的な説明なのだと思う)

162 :158:2006/09/23(土) 02:33:22
>>161
condの再定義自体してはいけないということなんですね
仮にmycondを定義するとしたら例のどこを修正したら良いのでしょうか?
ループになってる部分をなんとかしたら自分にも理解できそうになると思うのですが・・

163 :デフォルトの名無しさん:2006/09/23(土) 08:38:05
>>161
expand-condの中でmycondを使わない。ifで書けばよい。
expand-condが返す式の中では使ってもよい。
(ただし、その中でmycondに渡す引数が元のclausesより短くならないといけない)

164 :158:2006/09/23(土) 22:18:18
>>163
難しそうですがとりあえずチャレンジしてみます。
ありがとうございました。

165 :デフォルトの名無しさん:2006/09/24(日) 04:49:11
lambda式について質問なんですが
#'と'の違いは何なんでしょうか?
applyに渡すときは'#+でも'+でも大丈夫なのに
(setf (symbol-function 'hoge)
   #'(lambda (x) (+ x 2)))が大丈夫で
(setf (symbol-function 'hoge)
   '(lambda (x) (+ x 2)))がエラーになるのは何故なんでしょうか?

166 :デフォルトの名無しさん:2006/09/24(日) 06:48:56
' は quote で #' は function の省略形。
クロージャをつくるときは #' ということでヨロシク。

167 :デフォルトの名無しさん:2006/09/24(日) 07:31:00
apply とか funcall について言えば、シンボルとクロージャのどちらかを受け取れます。
http://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"

となります。

168 :デフォルトの名無しさん:2006/09/24(日) 12:09:22
ちなみにANSI Common Lispでは (lambda 〜) の前の #' は省略できることになっている

169 :165:2006/09/24(日) 16:19:50
うーん 難しい・・

そもそもapplyにシンボルで渡している場合でも
apply本体の中での第一引数が指してる物は関数の実体ではなくて
関数の名前ですよね
関数の名前を指してる変数しか持っていないのにどうやって関数を指すことが
できるようになるんでしょうか?

つまり
(setq a 'b)
(setq b 'c)
でaしか持ってない時にaを何回評価してもbにしかなりませんよね。
(つまりapplyの場合関数の名前しか手に入らない)
それでb、要は関数の名前を評価してc、つまり関数の実体を得る事をapplyはどうやって
行ってるんでしょうか?

170 :デフォルトの名無しさん:2006/09/24(日) 16:27:47
>>169
シンボルにはその関数定義を入れる箱が付属している。
その箱の場所を取り出すのが symbol-function なのだ。

171 :165:2006/09/24(日) 17:15:05
>>170
つまり大雑把に言うとapplyの中ではまず第一引数が指してるのが
'lambdaか#'lambdaチェックして
'lambdaだったらapplyのなかでさらに(apply (symbol-function 第一引数) '(第二引数))
を呼び出して#'lambdaだったら(apply 第一引数 '(第二引数))を呼び出すという
イメージでいいんでしょうか?

細かいことにこだわる自分にとって独学でLISP勉強するのはきついよ(つД`)

172 :デフォルトの名無しさん:2006/09/24(日) 17:20:19
>>171
http://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).

173 :デフォルトの名無しさん:2006/09/24(日) 17:30:23
>>171
まぁそんな感じ

174 :デフォルトの名無しさん:2006/09/25(月) 00:16:04
>>171
むしろ向いてる気がするんだけどね。「定義?仕様?実装を見ろッ」という
のは楽なんだけど,時々自分が悪いのかそれとも地雷踏んだのか悩むし

function designator:
1. シンボル ;; グローバル環境で関数名を表わすシンボル
2. 関数 ;; #'foo とか (lambda (...) ...)

と定義されているのでー手元の SLIME で試すとこんな感じ

CL-USER> (defun フゥゥ () 'グローバルフゥゥ)
フゥゥ
CL-USER> (flet ((フゥゥ () 'ローカルフゥゥ)) (apply 'フゥゥ ()))
グローバルフゥゥ
CL-USER> (flet ((フゥゥ () 'ローカルフゥゥ)) (apply #'フゥゥ ()))
ローカルフゥゥ


175 :デフォルトの名無しさん:2006/09/25(月) 17:38:39
>>174
あと日本語の情報がすくないのも英語が苦手な自分にとってはきついっす
fletの意味が竹内先生の本にもポールグレアムの本にも載ってなかったので
flet Lispとかで検索してみたんですが英語のページばっかりでdefunとの違いがよくわからないorz

176 :デフォルトの名無しさん:2006/09/25(月) 17:47:33
>>175
日本語のきちんとした説明が欲しいなら CLtL2 日本語版は買う価値があると思う

177 :デフォルトの名無しさん:2006/09/25(月) 17:49:11
fletは一時的に局所的な関数を定義するときに使う。

(flet
((関数名1 借り引数リスト1 局所関数本体1)
(関数名2 借り引数リスト2 局所関数本体2)
....
(関数名n 借り引数リストn 局所関数本体n))
関数本体)

例.
CL-USER> (defun foo(x)
(flet
((sq (arg) (* arg arg)))
(sq x)))
FOO
CL-USER> (foo 10)
100
CL-USER> (sq 10) ; ←sqはflet内部の局所関数なためエラーになる。

178 :デフォルトの名無しさん:2006/09/25(月) 17:52:54
また同じ構文の関数で labels と言う物がある。
flet では定義した局所関数は同じflet内の他の局所関数では使用できないが、
labels では使用できるところが違う。

例.
CL-USER>(defun foo(x)
(labels
((sq (arg) (* arg arg))
(qtl (arg1) (* (sq arg1) (sq arg1))))
(qtl x)))
FOO
CL-USER>(foo 10)
10000


179 :175:2006/09/25(月) 18:04:35
>>177,178
関数内で関数を定義できるということはlambdaとほとんど同じ意味で
名前をつけるので自分で自分を呼び出せる(再帰できる)というのが
lambdaと異なるという考えでいいんでしょうか?

180 :デフォルトの名無しさん:2006/09/25(月) 18:42:29
labelsで定義すると再帰できるが、fletは再帰できない。
lambda関数に比べてfletとかで定義した関数が便利なのは、
funcallを付けずに呼び出せるとこ。

181 :デフォルトの名無しさん:2006/09/25(月) 20:21:46
flet と labels の違いは局所関数名が局所関数の定義の lexical environment
に含まれるかどうか

>>178
> flet では定義した局所関数は同じflet内の他の局所関数では使用できない
できる
(flet ((myevenp (n e o)
(if (= n 0) t
(funcall o (1- n) e o)))
(myoddp (n e o)
(if (= n 0) nil
(funcall e (1- n) e o))))
(myevenp 11 #'myevenp #'myoddp))
=> NIL

>>180
> fletは再帰できない
できる
(flet ((factor (f n r)
(if (= n 1) r
(funcall f f (1- n) (* n r)))))
(factor #'factor 5 1))
=> 120

182 :デフォルトの名無しさん:2006/09/25(月) 22:55:03
ややこしー・・・

183 :デフォルトの名無しさん:2006/09/26(火) 04:30:00
まあ kludges, 1-971 な言語だからねえ。
funcall や apply にシンボルを渡せる、てのも便利な場面はなくはないだろうけれど。
scheme の方が初心者がはまりそうな穴は少ないかもしれんね。

>>181
気持ちはわかるが入門スレでそこまでつっこむのは如何なものか。

184 :デフォルトの名無しさん:2006/09/26(火) 07:01:44
でも細かい事が気になるらしいし、>>181はやさしいよ。

個人的には、細かい事が気になったら書き出しておいて、言語に慣れた後で調べた方がいいと思うけど。
今知るべき事とそうではない事を切り分けて、かつ分からない事を記録して行けば、
再起出来る出来ないなんていう理解の仕方ではなく、
>>局所関数の定義の lexical environmentに含まれるかどうか
というより本質的な理解を自力で出来るようになるはず。

185 :デフォルトの名無しさん:2006/09/26(火) 15:46:58
>>184
単に関数やマクロの使い方の説明をするだけでなくて、竹内先生の本のような
動的変数や環境とか束縛等の根っこの方の説明や、簡単な処理系の作り方を説明してるような
本はないでしょうか?
やっぱりGuy L. Steele Jrのあの高い本買うしかないのかなorz

186 :デフォルトの名無しさん:2006/09/26(火) 15:53:41
>>185
そういう本とはちょっと違うけど、CLtL2は良いよ。
第1版の時代からだから20年前から読んでるが、久しぶりに開くと今でも新しい発見がある。

187 :デフォルトの名無しさん:2006/09/27(水) 00:05:02
>>181 はパラメータで関数を渡してるし「やればできる」だろ…
普通再帰するときは↓のように labels つかうんだし

(labels ((myevenp (n)
(if (= n 0) t (myoddp (1- n))))
(myoddp (n)
(if (= n 0) nil (myevenp (1- n)))))
(myevenp 11))


188 :デフォルトの名無しさん:2006/09/27(水) 00:13:38
訳がすごく悪い(間違いだらけで学生にやらせた感がヒシヒシ)だけど培風館
の Lisp も全部読めばイイ本だよ.GC を作る例題とかあっていかんじ.英語が
がんばれるなら原書のほうがオススメだけど.

リアルオススメは Norvig の PIAP だな.Scheme や Prolog のインタプリタ,
コンパイラが例題にでてくるよ.コードも数ページ程度の短かいので動くから
おもしろいし.学生時代に読んだんだけど当時 Lex とか Yacc とか聞いたこと
もないド素人だったけど辞書片手にちょこちょこ読んだだけで普通に簡単なコ
ンパイラが作れるようになった.

189 :デフォルトの名無しさん:2006/09/27(水) 00:48:12
>>188
s/PIAP/PAIP/
Norvigは教科書書かせたら神だよね。

190 :185:2006/09/27(水) 06:11:13
やっぱり日本語の本でいいのは無いのかなorz
PAIP面白そうですが一万円・・・うーん

191 :デフォルトの名無しさん:2006/09/27(水) 11:55:18
>>190
>>186は日本語版の話。念のため。

192 :デフォルトの名無しさん:2006/09/29(金) 09:55:43
しかしNorvigはPythonに行ってしまった... うーみゅ

193 :デフォルトの名無しさん:2006/09/30(土) 14:40:59
まったく Norvig Norvig と女々しい奴だな?
こないだインタビューで好きなものは Python と Lisp ってゆってたYOOO


194 :デフォルトの名無しさん:2006/10/01(日) 16:31:17
クロージャについて調べているんですが
クロージャが関数が定義された時の環境を持ち運べるという考えなら
OOPのメンバ変数とどういう点が異なるんでしょうか?
ttp://www.geocities.jp/m_hiroi/xyzzy_lisp/abclisp11.html
このサイトのジェネレータの例をみると同じような考え方だと思うんですが

195 :デフォルトの名無しさん:2006/10/01(日) 16:57:36
クロージャを使ってOOPを実装することができる。
レベル(レイヤ)の違う話なので、どういう点が異なるのかと言われても当惑する。

196 :デフォルトの名無しさん:2006/10/01(日) 17:00:23
>>194
まあクラスから「関数+隠蔽された変数」という概念だけを取り出したものだと思ってくれてもいいかも。
オブジェクト指向やってた人からするとなんか貧弱なものに見えるかもしれんけど
Lispの他の機能とあわせればそれだけで困らんの。

197 :デフォルトの名無しさん:2006/10/01(日) 17:29:32
データを持っている関数 → クロージャ
関数を持っているデータ → クラス

こんな理解の仕方であってますか?

198 :デフォルトの名無しさん:2006/10/01(日) 17:30:51
>>197
そんな感じだね。(記号化して理解した気になるのは多少危険だけど)

199 :デフォルトの名無しさん:2006/10/01(日) 18:49:52
クラスってのは型の定義でしかないんじゃないか?
関数がクラスに属するかどうか、データ隠蔽を行うかどうかは言語ごと
(というかオブジェクトシステムごと) の違いだよねえ。

200 :デフォルトの名無しさん:2006/10/02(月) 05:06:32
>>197
適当な言語でクロージャそのものを勉強すればいいのに、
「クロージャとはどういうものか」しか理解しようとしないから
いつまでたってもわかんないんだと思うが。

201 :デフォルトの名無しさん:2006/10/02(月) 06:00:57
超簡易的な俺Lispとか実装してみると
その辺わりとガッチリした実感が得られるんじゃないかな

202 :デフォルトの名無しさん:2006/10/02(月) 13:27:15
質問者には多分環境という概念が存在しないと思うんだよな。
そんなものがない世界の頭のままでクロージャとは〜とか言ってても
あんまりよくわからないと思う。
って、また「環境って何ですか」とかやられてもかなわないんで
それはやっぱり、そういうのがある言語を勉強してねってことで。

203 :デフォルトの名無しさん:2006/10/03(火) 20:34:16
Peter SeibelのPractical Common Lispを読んだことのある人いますか?
CHAPTER8でわからない箇所があったので意見を聞きたいのですが

204 :デフォルトの名無しさん:2006/10/03(火) 20:44:56
>>203
どうぞ

205 :203:2006/10/03(火) 20:53:35
93Pに
(do-primes (p 0 19)
 (format t "~d " p))
というマクロ呼び出しがあるんですが
どうして(0 19)ではなくて(p 0 19)なんでしょうか?
わざわざpなんていう変数をわたさなくても
doの先頭でpを宣言してそれを使えば良いと思うんですが・・・

206 :デフォルトの名無しさん:2006/10/03(火) 22:13:50
hygienic にしておいた方が使いやすいから

207 :デフォルトの名無しさん:2006/10/04(水) 02:56:19
単純な例ならともかく実用を考えると
パッケージ関係でややこしいことになりかねないしね。

208 :205:2006/10/04(水) 12:06:48
よく見たらbodyの部分でpを使う必要がありましたねorz

209 :デフォルトの名無しさん:2006/10/06(金) 16:34:43
Practical Common Lispのスパムフィルタよーわからん。
カイ2乗が出てくる辺りから。

210 :デフォルトの名無しさん:2006/10/09(月) 11:07:58
Lispプログラムの実行について質問なのですが
Cなどだと実行ファイルを作成したら後はそれをクリックして実行するのが普通だと思うんですが
Lispの場合
処理系を起動させる→定義のロード→関数をタイピングして実行する
という流れが基本なんでしょうか?

211 :デフォルトの名無しさん:2006/10/09(月) 12:09:13
>>210
「クリックして実行」はウィンドウマネージャの機能だから、言語とは関係無いよ。
好きなようにやれば良い。

212 :デフォルトの名無しさん:2006/10/09(月) 12:14:39
>>210
はい。
タイプする代わりに処理系の引数で式を与えて評価させることもできるので

#!/bin/sh
sbcl --eval '(load "/path/to/hello.fasl")'

みたいなスクリプトなどを用意すれば独立した実行ファイルみたいに見えます。

多くの処理系では関数を実行する一歩手前の定義をロードした状態を
ファイルに保存し、次回その状態から起動することもできます。

sbcl --core my-program-defined.core --eval '(my-program:run)'

みたいに。

使ったことはありませんが、商用の Allegro Common Lisp とかだと
独立した実行ファイルを生成することもできるのではないでしょうか。

213 :210:2006/10/09(月) 12:34:33
>>211,212
212さんの挙げている上の例だとコンパイル済みのファイルをロードして評価する
というのを引数にしてsbcl実行時にあたえるということだと思うのですけれども
いろんなLispのプログラムを見てみたんですが一番最初に呼ばれる関数、
つまりCでいうmain関数のような物はどうやって定義するのでしょうか?
あとWinXP+clispで勉強をしているのですが文法の説明ではなく処理系自体の使い方を
説明した本やサイトなどはないでしょうか?
clispのマニュアルを読んでみたんですがイマイチよくわからないですorz

214 :デフォルトの名無しさん:2006/10/09(月) 13:27:05
>>213
main相当をやる方法は処理系依存も含めていろいろあるが、基本的にはトップレベルで
関数を呼び出せばそのまま実行されると思えばよい。
君の疑問に対する答えの多くはclispのマニュアルに書いてあるから、ちゃんと読むのが
良いだろう。

215 :デフォルトの名無しさん:2006/10/09(月) 13:43:33
CommonLispを勉強する理由は?

216 :デフォルトの名無しさん:2006/10/09(月) 13:54:51
いかすから

217 :デフォルトの名無しさん:2006/10/09(月) 13:58:29
いかれてるから

218 :217:2006/10/09(月) 14:01:08
もちろん良い意味でね。

219 :デフォルトの名無しさん:2006/10/09(月) 15:45:49
最近出た「入門Common Lisp」っていう本はどう?

220 :デフォルトの名無しさん:2006/10/09(月) 15:50:39
括弧のお化けだ

221 :212:2006/10/09(月) 16:03:04
>>213
lispってのは、基本的に書かれていることを頭から順に実行するだけです。
それは、対話的環境でもファイルでも同じ。
ファイルがコンパイルされていてもいなくても同じ。
loadは「ファイルを読み込んでそれを実行する準備」では《なく》、
「ファイルを開いて中身を順に実行する」という操作です。

少しぐぐってみましたが
http://cs.gmu.edu/~sean/lisp/LispTutorial.html
の Loading and Compiling Lisp の項などは多少参考になるかも知れません。
色々実験して体得してください。

222 :デフォルトの名無しさん:2006/10/09(月) 17:24:37
>>219
Lispをよく知らないプログラマ向けの教養本としてなら可。
情報系の学生にとってはゴミ。って感じでした。

223 :デフォルトの名無しさん:2006/10/09(月) 17:29:20
>>221
> lispってのは、基本的に書かれていることを頭から順に実行

Scheme等では必ずしもそうではない。
CommonLispスレだからCommonLispのことを指しているんだろうけど、
"lispってのは"という風に一般論にするのは好ましくないと思う。

224 :デフォルトの名無しさん:2006/10/09(月) 17:33:10
方言がありすぎる、
何を始めたらいいのかわからん

225 :210:2006/10/09(月) 17:52:38
>>221
なんとかワンクリックでロード、実行ができるようになりました。
ありがとうございます (´;ω;`)

226 :デフォルトの名無しさん:2006/10/09(月) 21:25:52
>>223
「基本的に」と言ってるんだからScheme等にも当てはまると思うが

227 :デフォルトの名無しさん:2006/10/09(月) 21:33:26
shiroたんが新たにグレアムの文を翻訳してた。
直接はLispに関係ないけど。
http://practical-scheme.net/trans/mit-j.html

>>226
Lispの思想を考えると基本的に順番は規定されてないと考えるべきだと思う。
最も普及してるCommonLispで規定されてるけど、
Lispの中ではむしろ異端だろ。

228 :デフォルトの名無しさん:2006/10/09(月) 21:44:11
>>227
うーん。Lispの思想かなぁ。あまり賛成できない。

229 :デフォルトの名無しさん:2006/10/09(月) 22:58:51
一番使われている方言は何?

230 :デフォルトの名無しさん:2006/10/09(月) 23:09:44
>>229
マジレスすると emacs lisp、そして lisp としては最悪。
真面目に勉強するなら Common Lisp でいいんじゃねーの?
最近「practical common lisp」とか本も出てるし。
>>222
おれは非情報系だから、ラムダ計算のとこだけ面白かったよ。

231 :デフォルトの名無しさん:2006/10/09(月) 23:12:49
>>229

ttp://www.gigamonkeys.com/book/

これだ!!

232 :デフォルトの名無しさん:2006/10/09(月) 23:31:09
そんな思想ないから。

233 :デフォルトの名無しさん:2006/10/10(火) 00:24:39
いまどきは実行ファイルをクリックして実行させるのが普通なのか・・・
如何にしてforkしてexecするか、ってのが本質だと思ってるのはCUI環境で育ったジジィだけ?
lispに関係ないから下げとくね。

234 :デフォルトの名無しさん:2006/10/10(火) 02:08:48
実行ファイルをクリックしたってforkしてexecするという本質は同じですよ。
(OSが違うとシステムコールの流儀は多少違うけど)
変わったのは人間様がどう接するかという部分だけ。

235 :デフォルトの名無しさん:2006/10/10(火) 02:37:35
>>210
マジレスすると、 SLIME とかの統合開発環境を使うのが Lisp では(少なくと
も Common Lisp では)一般的だ。エディタでかいて、ダブルクリックで実行し
て…というサイクルでも開発できるけど、たぶん面倒だと思う。

LispWorks みたいにエディタ、対話環境 (REPL)、その他ツールが一体になって
るのが普通。 Windows で CLISP だと Emacs + SLIME って手があるね。

ttp://lispuser.net/commonlisp/clisp.html


236 :デフォルトの名無しさん:2006/10/10(火) 03:23:06
みなさん、Schemeではプログラミングしないんですか?
Common Lispのほうがいいんですか?

237 :デフォルトの名無しさん:2006/10/10(火) 03:40:09
Schemeは自閉症気味。徹底的に綺麗に書いてやろうというモチベーションのときは
Schemeの方が好きだけどとにかく仕事を片付ける為に使うとか、ドロ臭い実戦投入には
Common Lispの方が向いてると思う。Gaucheくらいライブラリ充実してると話は別だけど。
デバッグ環境の強力さとかプロファイラの充実っぷりではまだCommon Lispの方が上だと思う。

ペチじゃないChezとか商用の強力そうなScheme使ったことない漏れの個人的見解なんで
猛者の反論を待つ。

>>236 は両方使ってみて気に入った方を使えばいいのでは。どっちも似たようなもんだし(って書くと怒られそうだけど)

238 :デフォルトの名無しさん:2006/10/10(火) 03:57:24
少なくともLisp以外の言語から比べたらどっちも似たようなもんだわな

239 :デフォルトの名無しさん:2006/10/10(火) 05:53:19
好みで良い希ガス

240 :デフォルトの名無しさん:2006/10/12(木) 02:30:41
* (macroexpand '(lambda (x y) (cons x y)))
#'(LAMBDA (X Y) (CONS X Y))
* (lambda (x y) (cons x y))
#<Interpreted Function (LAMBDA (X Y) (CONS X Y)) {483AC071}>
* #'(lambda (x y) (cons x y))
#<Interpreted Function (LAMBDA (X Y) (CONS X Y)) {483ACA31}>
* #'cons
#<Function CONS {104FE6F1}>
* ((lambda (x y) (cons x y)) 1 2)
(1 . 2)
* (#'(lambda (x y) (cons x y)) 1 2)
エラー
* (#'cons 1 2)
エラー

納得行かねー。

241 :デフォルトの名無しさん:2006/10/12(木) 03:26:10
>>240
入門レベルなので解説できないけど、↓のヒントにならない?
(funcall #'cons 1 2)
(funcall #'(lambda (x y) (cons x y)) 1 2)
(funcall (function cons) 1 2)


242 :デフォルトの名無しさん:2006/10/12(木) 03:48:24
http://www.lispworks.com/documentation/HyperSpec/Body/03_abab.htm

>If the car of the compound form is not a symbol,
>then that car must be a lambda expression,
>in which case the compound form is a lambda form.

ってことで、式の car 部はシンボルかラムダ式じゃなくちゃいけない。
で、((lambda (x y) (cons x y)) 1 2) は lambda form と解釈されるので、
その時点で car 部にある (lambda ...) という式はマクロ展開されない。
つまり、((lambda (x y) (cons x y)) 1 2) -> (#'(lambda (x y) (cons x y)) 1 2) ではない。

また、(#'foo ...) -> ((function foo) ...) であり、これは不正な式になる。

まあ、(lambda ...) -> #'(lambda ...) ってマクロは余計なお世話だよなあとは思う。

243 :デフォルトの名無しさん:2006/10/12(木) 04:06:02
> 式の car 部はシンボルかラムダ式じゃなくちゃいけない。
なんと。
> その時点で car 部にある (lambda ...) という式はマクロ展開されない。
ななんと。
> また、(#'foo ...) -> ((function foo) ...) であり、これは不正な式になる。
そうか。なるほどこれは確かに。

いや、((symbol-function 'cons) 1 2)も試したんですよ?
でもそれを認めると評価して関数になるものでよければ
変数でもいいじゃねーかということでschemeになっちゃうか……

244 :デフォルトの名無しさん:2006/10/12(木) 06:16:52
典型的な Lisp-1 vs Lisp-2 だね。あまりにも頻繁に議論になるので経験長い
人は耳タコでしょう。それぞれメリット、デメリットがあるので「どっちが優
れている」という事はない。どっちが好みか、という事だね。

以下、ニュースグループからの抜粋。

例:
Lisp-1 (((f x) y) z) vs Lisp-2 (funcall (funcall (f x) y) z)

Lisp-1 のほうが圧倒的に読みやすい、というなら Scheme を試してみるのがい
いかもしれないね。Lisp-2 では名前は関数名以外の使用法もあるので。

例:
(defclass person ()
((name :accessor name)))

(defmethod m ((p person))
(with-slots (name) p
... (name p) ... ; the accessor
... name ...)) ; the slot

Lisp-2 より Lisp-1 のほうが好みで、Common Lisp 処理系でも Lisp-1 を実現したいなら
↓のように arensi ライブラリ附属の lisp-1 マクロでも使うといい。

(with-lisp1 ;; Lisp-1 にしちゃうマクロ
(let ((a +))
(a 2 3))) ==> 5

http://groups.google.com/group/comp.lang.lisp/browse_thread/thread/82994055009163e9


245 :デフォルトの名無しさん:2006/10/12(木) 09:37:56
コードの可読性という意味では funcall が必要という流儀は嫌いではないな

246 :デフォルトの名無しさん:2006/10/12(木) 09:47:28
間を取ってfuncallの名前を短くすればいいんじゃね?
fとかに。

247 :デフォルトの名無しさん:2006/10/12(木) 10:15:37
callでいいよ

248 :デフォルトの名無しさん:2006/10/13(金) 00:29:53
Allegro Common Lispを使って、グラフィックを描きたいのですが(単純に線を引くだけでも)、何をどうすればよいのかも分かりません。
全くの初心者で申し訳ないのですが、何かよい参考書のようなものはないでしょうか。

249 :デフォルトの名無しさん:2006/10/13(金) 00:45:46
ACLチュートリアルでいいじゃん

250 :デフォルトの名無しさん:2006/10/13(金) 19:34:53


251 :デフォルトの名無しさん:2006/10/13(金) 19:36:09


252 :デフォルトの名無しさん:2006/10/13(金) 19:36:48
age

253 :デフォルトの名無しさん:2006/10/19(木) 23:38:33
lispの入れ子構造についての質問なんですけれども
C言語と違ってたとえば
(defun fact(N)(cond ((equal n 0) 1)
(t (times N(fact (sub1 N)))))
だとIF文にあたるcondはどういう挙動になりますか?


254 :デフォルトの名無しさん:2006/10/19(木) 23:55:15
式の通りになります

255 :デフォルトの名無しさん:2006/10/20(金) 00:35:44
>>253
もういちど国語を勉強して、普通の論理読解力・記述力を身につけような。
この先の人生できっとペイするから。

256 :デフォルトの名無しさん:2006/10/20(金) 12:55:17
普通の読解力が無いから
たぶんこの展開を「イジメられた」と解釈するだろう。

257 :デフォルトの名無しさん:2006/10/20(金) 15:10:26
^^;

258 :デフォルトの名無しさん:2006/10/21(土) 10:16:34
>>253
よ。もうちょっと聞きたい事を詳しくゆってくれ。
がんばって推測してみた。

1. (equal n 0) なら 1 を返す
2. それ以外なら (* n (fact (1- n))) を返す

という挙動をする。この場合だと IF とほとんど同じだね。

C: if (n == 0) {
return 1;
} else {
return n*fact(n-1);
}

LISP:
(cond ((equal n 0) 1)
(t (* n (fact (1- n)))))
あるいは
(if (equal n 0)
1
(* n (fact (1- n))))

…こゆ事を聞きたいのかね?それとも return が無いとかそんな話だろうか。

259 :デフォルトの名無しさん:2006/10/21(土) 13:10:53
>>258
エスパーキター!

260 :デフォルトの名無しさん:2006/10/22(日) 13:36:50
>>253本人に出てきて貰って何が聞きたかったのかしっかり解説して貰いたい。

261 :デフォルトの名無しさん:2006/10/22(日) 13:47:48
Common Lisp には関数 times も sub1 も無いんだからスレ違いだわな

262 :デフォルトの名無しさん:2006/10/22(日) 13:49:54
カタいこというなよ。どうせ他にネタもないんだし、超能力を鍛えようぜ。

263 :デフォルトの名無しさん:2006/10/25(水) 13:04:11
.NETでうごかせるLisp言語ってないですか?
非常に興味あるんですが、今までのライブラリも捨てがたす・・・(・ω・)

264 :デフォルトの名無しさん:2006/10/25(水) 18:37:00
http://www.lsharp.org/index.html
これはちがうかな?

265 :デフォルトの名無しさん:2006/10/26(木) 02:37:47
>>263
過去スレに色々出てるから見られたら見てみるよろし。

266 :デフォルトの名無しさん:2006/10/26(木) 07:22:56
Common Lisp から .NET を呼び出すという手もある
http://weitz.de/rdnzl/

ECL 方面では、これで使って構文ハイライトや補完といった
Windows 用の LISP Shell を製作中。
http://sourceforge.net/forum/forum.php?forum_id=609266

267 :デフォルトの名無しさん:2006/10/30(月) 20:44:02
CommonLispって、何から勉強したらいいの?


268 :デフォルトの名無しさん:2006/10/30(月) 21:12:19
CLISP for Win32の日本語の使い方.HTMLにある例のソースパスの
部分を修正しdot.emacsに追加しています。
ところが読込で下記のエラーで前に進みません。

Symbol's function definition is void: pushnew

Takashi Hiromatsu さんのNTEmacs上で動かしています。

269 :デフォルトの名無しさん:2006/10/30(月) 21:54:47
日本語版の『On Lisp』はいつごろ出版されるのでしょうか?

http://user.ecc.u-tokyo.ac.jp/~t50473/onlispjhtml/ を一通り読んだのですが、
印刷されたものを手元に置いておきたいので。

もし関係者の方がこのスレを見ていたらおせーて下さい!

270 :デフォルトの名無しさん:2006/10/31(火) 00:55:54
>>268 lispuser.net にある奴?俺んとこでも emacs -q で起動したら再現したな。
pushnew の行の前で↓の行を足せば ok。
(require 'cl)
だれか中の人に報告よろしく。

271 :デフォルトの名無しさん:2006/10/31(火) 08:43:53
270さん、ありがとうございます。
これで、「やさしいLISP入門」酒井皇治著の勉強が出来ます。

272 :デフォルトの名無しさん:2006/10/31(火) 17:03:42
CMUCL の読み方ってどう読むんですか?
普通に、「シーエムユーシーエル」ですかね?

273 :デフォルトの名無しさん:2006/10/31(火) 17:10:26
クミュクル

274 :デフォルトの名無しさん:2006/10/31(火) 17:20:48
かーねぎめろんゆにばーしてぃこもんりすぷ

275 :デフォルトの名無しさん:2006/11/01(水) 01:11:44
setqとsetの違いを教えてください。

276 :デフォルトの名無しさん:2006/11/01(水) 01:26:18
不正確だが雰囲気的に近い表記をすると、 (setq x v) ≡ (set (quote x) v)
【実際には set の対象にできるのは大域変数だけ】

正確には (set s v) ≡ (setf (symbol-value s) v) と定義されている

277 :flatline ◆r6EONKKhcc :2006/11/03(金) 02:08:16
>>269

すいませんすいませんすいません
そのままの姿勢でもうしばらくお待ち下さい

278 :デフォルトの名無しさん:2006/11/03(金) 02:16:12
よっしゃ。ちょっと辛いけどこのままの姿勢で待つよ。

279 :デフォルトの名無しさん:2006/11/03(金) 09:02:36
>>269
俺はプリンタで全部印刷して持ってる。

280 :デフォルトの名無しさん:2006/11/03(金) 20:01:31
おれは検索しやすくemacsでみやすいtexソースを常備>OnLisp

281 :デフォルトの名無しさん:2006/11/03(金) 23:03:59
>>277
章とかページが入るべきとこにvoxとかfooとか書いてあるんだけど、
ラベルの付け忘れみたいなもん?

282 :flatline ◆r6EONKKhcc :2006/11/04(土) 00:07:10
章ではそうなってないはず,ページですよね?
\label とかするのめんどくて.

283 :デフォルトの名無しさん:2006/11/04(土) 00:13:26
なぜこんな古い言語を勉強するのですか?


284 :デフォルトの名無しさん:2006/11/04(土) 00:14:26
>>282
「2.9 コンパイル」の最後に「第foo章を参照」ってのがあるけど。

285 :デフォルトの名無しさん:2006/11/04(土) 00:15:26
>>283
古いけど、発展が止まってるわけでもないので、
現状に合わないってこたないよ。

286 :デフォルトの名無しさん:2006/11/04(土) 00:15:33
>>283
言語が古いと何か困ることがありますか?

287 :flatline ◆r6EONKKhcc :2006/11/04(土) 01:07:02
>>284

ありゃ,本当ですね.でも他には少ないはずです.
適宜 原文に当たって下さい.(そこで指しているのは7.9節のようですね)

>>283
C++やRubyにはない機能を標準搭載しているから.
すなわち処理系の動作をプログラミングできる「マクロ」.

288 :デフォルトの名無しさん:2006/11/04(土) 13:44:24
今必要なのは新しいCommonLispの仕様だ!
より巨大化してナウい言語に成長するんだ!

289 :デフォルトの名無しさん:2006/11/04(土) 13:48:57
よし、俺が設計してやろう

290 :デフォルトの名無しさん:2006/11/04(土) 15:32:19
2ch初のLisp処理系を

291 :デフォルトの名無しさん:2006/11/04(土) 16:18:26
ここは入門スレと銘打ってるからどうだかわからないけど、
他のLisp系スレの住人なら、半数くらいは自作の処理系持ってそうだな。
勿論、公開に耐えるほど作り込んでいる人は一部だろうけど。

292 :デフォルトの名無しさん:2006/11/04(土) 17:30:45
すべての仕様を取り込んだ処理系ってあるの?


293 :デフォルトの名無しさん:2006/11/04(土) 17:49:13
すべての仕様を取り込まないとCommon Lispとは呼べません

294 :デフォルトの名無しさん:2006/11/04(土) 17:57:55
どの処理系を使用してますか?

私はxyzzyに内臓してるやつです。

295 :デフォルトの名無しさん:2006/11/04(土) 18:05:37
clisp

296 :デフォルトの名無しさん:2006/11/04(土) 18:05:50
>>294
それは(このスレ的には)偽物だぁああああああ
CLISP とか GCL とか CMUCL とか SBCL とかフリーの本物はいくらでもあるぞおおおおおお

297 :デフォルトの名無しさん:2006/11/04(土) 19:15:51
>>296

え、xyzzyは偽物なの?
CommonLispじゃないの?

ずっと使ってたよ。

298 :デフォルトの名無しさん:2006/11/04(土) 19:40:34
>>297
偽者っていうと語弊があるかもしんないけど、
規格を半分も満たしてないみたいだよ。

299 :デフォルトの名無しさん:2006/11/04(土) 20:38:12
xyzzy のは Common Lisp に近いけど違うね
方言の一種というか。

300 :デフォルトの名無しさん:2006/11/04(土) 20:51:18
xyzzy の Common Lisp 準拠率は6割程度ってどっかで見た気がする。
まあ似たような系である Emacs Lisp と比べれば
はるかに Common Lisp に近いと思うけどね。

301 :デフォルトの名無しさん:2006/11/04(土) 22:00:00
蟹と蟹カマくらい違うな

302 :デフォルトの名無しさん:2006/11/04(土) 23:20:57
勉強するのにはxyzzyでもいいと思うよ。


303 :デフォルトの名無しさん:2006/11/05(日) 04:04:34
>>302
俺はそうは思わんな。初心者こそちゃんとした処理系で勉強しないと本を読んだりしたときに
混乱するだろう。xyzzyで勉強するのは自由だが、あれをCommon Lispだと思ってここで質問
したりするのはやめてほしい。

本物の蟹が無料で食べられるのに、わざわざ蟹カマを食べる必要はないと思う。

304 :デフォルトの名無しさん:2006/11/05(日) 04:33:55
良いテキストもあるし、xyzzy で勉強しても良いんじゃない。

ttp://www.geocities.jp/m_hiroi/xyzzy_lisp.html

食の本場フランスでは蟹カマボコが人気らしい(マジ

305 :デフォルトの名無しさん:2006/11/05(日) 09:10:15
xyzzy は偉大なソフトウェアだと思う。あれを個人で作ったというのは
けっこうとんでもない作業で Common Lisp の実用性を示す良い例だ。

でも 開発環境としては現状 Emacs + SLIME や LispWorks Personal の
ほうが充実してると思う。 SLIME の移植もしたいけど、なかなか時間がとれないなぁ。


306 :デフォルトの名無しさん:2006/11/05(日) 13:13:27
偉大なソフトウェアかどうかと、Common Lispかどうかは独立した命題だ。
Common Lispでないのだからxyzzyはスレ違いだと思う。
少なくともCommon Lispの勉強にはCommon Lispのほうが適すると思う。

307 :デフォルトの名無しさん:2006/11/05(日) 13:43:58
入門レベルなら好きなのでいいんじゃねぇ?

308 :デフォルトの名無しさん:2006/11/05(日) 14:19:31
CLisp + Meadowでやってますが、何か問題ありますか?

みんなは?

309 :デフォルトの名無しさん:2006/11/05(日) 15:16:45
入門者ですが、Emacsで、slime + SBCL/CLISPでやってます。
SBCLとCLISPは、Lispboxに入ってるやつ。
主にSBCLですが、slime-autodoc-modeの表示がCLISPよりわかりやすいので。

310 :デフォルトの名無しさん:2006/11/05(日) 17:07:39
入門CommonLispの通りに設定しても、Meadow上でCLispが動きません。
誰か教えてください。

311 :デフォルトの名無しさん:2006/11/05(日) 19:07:10
もっと詳しくかきなさい、どんな設定をしたのかとか

312 :デフォルトの名無しさん:2006/11/05(日) 19:31:57
「入門CommonLisp」を持ってない人のほうが多いことに気が付こうね

313 :デフォルトの名無しさん:2006/11/05(日) 21:45:57
ここにいる一定数が読んでることが期待できるCommon Lispの本なんて
GrahamのANSI Common Lispくらいじゃない?
PCLはどうなんだろう。俺は3/4くらいは読んだけれども。

314 :デフォルトの名無しさん:2006/11/06(月) 00:34:28
特定の本についてのスレではないのだから、本の内容に関連する質問ではその
内容についても簡単に説明するのが礼儀というものだろう

315 :デフォルトの名無しさん:2006/11/06(月) 01:45:45
ここでエスパーの登場

316 :デフォルトの名無しさん:2006/11/06(月) 04:08:31
ごめん俺サイコキネシスしか使えない

317 :デフォルトの名無しさん:2006/11/06(月) 17:40:54
あれは簡単だからな

318 :デフォルトの名無しさん:2006/11/06(月) 20:03:25
俺、公文で習ったよ<サイコキネシス

319 :デフォルトの名無しさん:2006/11/06(月) 23:21:00
むしろ魔法使い級のlispハカー登場↓

320 :デフォルトの名無しさん:2006/11/07(火) 02:16:02
竹肉だが。何の用かね?

321 :デフォルトの名無しさん:2006/11/07(火) 02:46:27
↑偽物キター!

322 :デフォルトの名無しさん:2006/11/07(火) 08:18:32
彼は本物の竹肉だよ。

Mock Turtleみたいなもんだ。

323 :デフォルトの名無しさん:2006/11/11(土) 00:31:12
遂にキタ!!

http://journal.mycom.co.jp/articles/2006/11/09/cusp/

324 :デフォルトの名無しさん:2006/11/11(土) 18:27:15
Lispの使い道がわなんない。

325 :デフォルトの名無しさん:2006/11/11(土) 18:53:50
コンピュータの使い道と同じですよ

326 :デフォルトの名無しさん:2006/11/12(日) 02:20:42
>>323
こ、これはカスプと呼んで差し支えないのでせうか・・・

327 :デフォルトの名無しさん:2006/11/14(火) 02:23:01
指定されたファイルに書かれている整数を、逆順に表示するプログラムをつくるにはどのようにすればよいのでしょうか?
例えば、123 456 78
と入力されると、
78 456 123
と表示されるようなのです。

328 :デフォルトの名無しさん:2006/11/14(火) 03:09:32
大筋だと
1. ファイルを開く
2. 数字を一個読込む
3. リストに cons する (以下、入力がなくなるまで 2. -> 3. を繰りかえし)
4. cons して作ったリストを先頭から順番に表示してゆく
cons については教科書か配布資料かぐぐる様に聞け。答はホレ。

(defun answer-327 (filename)
(with-open-file (s filename :direction :input)
(do ((i (read s nil :eof) (read s nil :eof))
(lst nil (cons i lst)))
((eql i :eof)
(format t "~{~A~^ ~}" lst)))))

宿題なら「今迄習った関数」「授業の教科書」くらい教えてくれんと、
範囲外の機能を使ってしまってパクリがバレバレになるかもしれんよ。

329 :デフォルトの名無しさん:2006/11/17(金) 03:11:34
Common Lisp入門者なんだけど関数リファレンスってみんな
hyperspecとかをみているの?
なにが標準なのかよくわからなくての質問なんだけど


330 :デフォルトの名無しさん:2006/11/17(金) 11:24:05
CLtl2とhyperspecでおk

331 :デフォルトの名無しさん:2006/11/17(金) 21:21:47
最新の標準は ANSI Common Lisp の規格書である HyperSpec
CLtL2 はその一個前。こいつは CLOS とかがないとかちょっと違うけど、
まぁ基本的なとこはほとんど同じ。

商用のコンパイラにはマニュアル一式がついてくる(HyperSpec を含んでる)
のでそれを見てる。
http://www.lispworks.com/documentation/
http://www.franz.com/support/documentation/

フリーの処理系は、だいたい HyperSpec が基本で、その追加や拡張分だけ
載ってるってケースが多いね。

332 :デフォルトの名無しさん:2006/11/17(金) 22:21:02
>>331
CLOSが無いのはCLtL初版。CLtL2はCLOSは入ってるよ。
ANSIとCLtL2の差分はさほど多くない。(例えば lambda マクロ)

333 :デフォルトの名無しさん:2006/11/23(木) 02:36:46
処理系が多すぎるから普及しないんじゃないの?

334 :デフォルトの名無しさん:2006/11/23(木) 03:07:52
どうやったら減らせると思う?

335 :デフォルトの名無しさん:2006/11/23(木) 04:30:36
多いと言っても、選択肢になるのは商用なら Allegro か LispWorks、
フリーなら CLISP か SBCL くらいに収束してきてるんじゃないかな。

336 :デフォルトの名無しさん:2006/11/23(木) 05:10:37
SchemeはLispの処理系には数えないの?

337 :デフォルトの名無しさん:2006/11/23(木) 09:46:47
…ここは Common Lisp スレだからな

338 :デフォルトの名無しさん:2006/11/23(木) 12:59:42
C言語とD言語くらいの違いはあるからな

339 :デフォルトの名無しさん:2006/11/26(日) 13:33:20
lispの凄いオープンソースプロジェクトがでる下地はだいぶ整ったよな
でも現実は開発者が集まらないからか、全然もりあがってる風がないな

340 :デフォルトの名無しさん:2006/11/26(日) 14:49:25
どこ見てるのかわかんねーけど、個人プロジェクトを除外しても
SBCL、 Maxima、 SLIME あたりは結構活発だよ。おっかけるだけでも結構大変だもん。
SLIME とか Edi Weitz がネットニュースに投稿した SLIM がベースにボランティアが発展させた
典型的なオープンソースプロジェクトだと思うけど。

341 :デフォルトの名無しさん:2006/11/26(日) 15:17:40
JAVA6ではスクリプト言語がVM上で動かせるようなナルトのこと。
lispを訴える最後のチャンスです!!

342 :デフォルトの名無しさん:2006/11/26(日) 15:22:26
普通 CL をスクリプト言語とは言わないんじゃないかな。
そのチャンスとやらは Scheme に任せる方向で。

343 :デフォルトの名無しさん:2006/11/26(日) 15:52:23
>>340
いや、それらをlisper以外が使うかね?
Rails 見ろ。正直すごいとは思わないけど、注目をあつめてruby人気を牽引してる。

344 :デフォルトの名無しさん:2006/11/26(日) 16:29:15
… Rails って Rubyist 以外が使うのか? Web アプリ用のフレームワークなら
個人的には Perl の Jifty のほうに注目してるけど。手軽な Web アプリを目指すなら
あのくらいの割り切りがいいんじゃないかなぁ。

それはともかく Maxima は Lisper 以外のユーザーのほうが多いんじゃないかな。
俺の周りでは数学系の人が Mathmatica と一緒に使ってるつーパターンが多いね。
セットアップを頼まれる事はあったが俺のようなプログラマは自分ではめったに使わない。

345 :デフォルトの名無しさん:2006/11/26(日) 21:50:25
lambda 式に対する #' の用途がいまひとつよくわかりません。
(defun make-adder (x) (lambda (y) (+ x y))) も
(defun make-adder (x) #'(lambda (y) (+ x y))) も
同じように動くように見えます。(CLISP)


346 :デフォルトの名無しさん:2006/11/26(日) 21:56:20
>>345
Common Lispの規格改訂で同じように動くようになったのだ。
ANSI Common Lisp以降、(lambda ...) は #'(lambda ...) に展開されるマクロ
として定義されている。
本質的にはfunction特殊形式という奴なので、#' を書くのが正書法と言えるかな。

347 :デフォルトの名無しさん:2006/11/26(日) 22:07:47
それは >>332 がいってる ANSI Common Lisp で導入された LAMBDA マクロと
いうものだよ。なんでも ANSI Common Lisp 標準化の際に ISLISP を ANSI CL
で実装するための互換レイヤーとして導入されたそうだ(ネタ元: Practical Common Lisp)。
(lambda (y) (+ x y)) はこのコンテキストだと (funcation (lambda (y) (+ x y))) に展開される。
だから実質 #' を書くのとかわらない。こっちも (funcation ...) に展開されるからね。
#' で書くほうが統一されてていいんじゃね。Practical Common Lisp でも #' は全部につけてるよ。

348 :347:2006/11/26(日) 22:10:58
うぎゃぁ。かぶったうえに俺のほうがクドい… 346 に嫉妬!!

349 :345:2006/11/26(日) 22:18:39
>>346
へぇー。なるほど。ありがとうございます。
ところで CommonLisp では #' してない生の lambda 式の評価結果って何なのですか?
;; Elisp では (consp (lambda (x) x)) => t で、ありゃぁ…って思いますたが

350 :345:2006/11/26(日) 22:20:49
>>347
あ、行き違いでした。詳しい解説ありがとうございます。

351 :デフォルトの名無しさん:2006/11/27(月) 00:27:56
Emacs Lisp でも
(funcall (byte-compile
          (lambda ()
            (list (consp (lambda ()))
                  (consp #'(lambda ()))
                  (consp '(lambda ()))))))
=> (nil nil t)
だよ。lexbind では closure が導入されてるからバイトコンパイルしなくても
同様なんじゃないかな。

352 :デフォルトの名無しさん:2006/11/27(月) 00:30:13
>>349
ANSI以前のCommon Lispではエラーだと思う。lambdaという関数が無いぞ、みたいな。

353 :346:2006/11/27(月) 00:33:16
>>348
いえいえ。ISLISPとの関連は知らなかったので勉強になったよ。
もうちょっと流行るかと思ったんだけどな。>ISLISP
さすがに3つも標準(方言)は要らんということか。

354 :345:2006/11/27(月) 01:21:39
>>351
>>352
どうもです。
ああ、なるほど。バイトコンパイルすると、関数オブジェクトになるんですね。

この方面で最初に触ったのが Scheme だったので、
Common Lisp や Elisp の lambda が、いまいひとつしっくりきませんでした。


355 :347:2006/11/27(月) 01:22:00
フフフ。入門スレから解答しまくってるんだが、 >>331 では CLtL2 と CLtL を取り違えるという
失態をおかした後だったんでね。とりあえず >>332>>346 は勝手にライバル視。

しかしなんだ。あんたも ISLISP に期待してたのか。俺も OpenLisp とかインストールしてたクチだぜ。
あと EuLisp とかにも期待してたよ。継続、軽量プロセス(スレッド)あたりに。懐しいなぁ…。

356 :デフォルトの名無しさん:2006/11/29(水) 19:35:54
PHウィンストンのLisp読んでみたいと思ってるんだけど
いくら探しても<2>の方しか見つからないorz
通販で<1>が買えるところってないでしょうか?

357 :デフォルトの名無しさん:2006/11/29(水) 20:29:53
>>356
http://www.amazon.co.jp/gp/product/4563007846
から「すべての出品を見る」

358 :デフォルトの名無しさん:2006/11/29(水) 20:49:44
357さんが挙げているのと自分が探してるのは版が違うっぽいですが、
どんな差があるんでしょうか?
<1>+<2>と357さんが挙げてるのでは200ページぐらい量が違うみたいなんですが

359 :デフォルトの名無しさん:2006/11/29(水) 21:01:39
こっちか
http://www.amazon.co.jp/gp/product/4563014648

360 :デフォルトの名無しさん:2006/11/29(水) 23:07:34
あーそれ良い入門書だよね。日本語版は訳が微妙でストレスがたまったけど。


361 :デフォルトの名無しさん:2006/11/30(木) 01:32:12
>>356
アマゾンのマーケットプレイスに時々出てくるから、マメにチェックするといいよ。

図書館で借りて読むってのも手っとり早いと思う。

362 :デフォルトの名無しさん:2006/11/30(木) 03:33:13
i < 原書で買えば一冊にまとまってる上に訳に悩まされる事がないらしいぞ

363 :デフォルトの名無しさん:2006/11/30(木) 09:13:41
PCLですら文が難しいと感じるぐらい英語苦手なので
原書だと厳しいです(´;ω;`)
361さんのいうとおりアマゾンにでてくるのを気長に待とうと思います。

364 :デフォルトの名無しさん:2006/11/30(木) 15:52:52
原書読んだりするのも慣れの問題だからね。避けてると一生読めないよ。
Lispだけでなく英語の勉強にもなるから一石二鳥だと思って原書読むのをお勧めする。

365 :デフォルトの名無しさん:2006/11/30(木) 16:14:06
わかりました、がんばってみます(´;ω;`)
うまく訳せないところがあったら聞いていいでしょうか?

366 :デフォルトの名無しさん:2006/11/30(木) 16:47:00
364ではないけど、どうぞ。
できればいちいち日本語に訳さなくても意味がとれるよう頑張れ。
文意がよくわからないところは腰を据えて訳すのも一つの方法だけど。

英語の本を読むのは、最初の一冊は大変だよね。
最初の一冊で名著とかある分野のバイブル的な教科書にあたるものが読めると
いい経験になる。

367 :デフォルトの名無しさん:2006/11/30(木) 17:12:58
ありがとうございます。
このスレには親切な人が多いなあ(´;ω;`)

368 :デフォルトの名無しさん:2006/11/30(木) 17:35:31
いちいちツラ文字いれんなうぜえ

369 :デフォルトの名無しさん:2006/11/30(木) 18:39:39
>>368
顔文字くらいでがたがたいうな

370 :デフォルトの名無しさん:2006/11/30(木) 19:40:39
原書初版(1980)
ttp://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年の版の詳細について知っている人がいたら
教えてください

371 :デフォルトの名無しさん:2006/11/30(木) 21:14:15
ヒント: ISBN
ヒント: 出版社名


372 :デフォルトの名無しさん:2006/11/30(木) 21:35:52
なるほど。独逸か。
ttp://www.amazon.de/dp/3925118616/
1987年になってるけど追求やめ。

373 :デフォルトの名無しさん:2006/12/01(金) 00:55:30
>>365 がんばれ。SICP よりは格段に脳味噌酷使レベルが低いから初チャレン
ジにはいいぞ。わからん事はがんがん聞いてくれ。たとえ途中で力尽きても、
なにもしないよりは遥かにマシだからな。

374 :363:2006/12/01(金) 19:31:34
ではお言葉に甘えて早速・・・

PCLの38ページ中ほど
ttp://www.gigamonkeys.com/book/syntax-and-semantics.html
のBreaking Open the Black Boxから少し進んだところにある

In Common Lisp things are sliced up a bit differently, with
consequences for both the implementer and for how the language is defined.

の文がどういう意味なのかよくわかりません。
コンマで区切られた前半のほうはCommon Lispの場合はちょっと事情が異なる〜
みたいなことを言ってるんだと思うんですが、後半のほうはさっぱりわかりません。
訳すとしたらどのような風になるんでしょうか?

375 :デフォルトの名無しさん:2006/12/01(金) 19:39:13
>>374
Common Lispの場合、実装から見ても言語の定義から見てもちょっと事情が違う。

376 :363:2006/12/01(金) 19:55:58
>>375
(直訳)Common Lispの場合少し事情が異なる、実装と言語がどのように
定義されたかの両方の結果として

をこなれた文にすると
Common Lispの場合、実装から見ても言語の定義から見てもちょっと事情が違う。

という文になるという考えでいいでしょうか?
うーん。難しい・・・

377 :デフォルトの名無しさん:2006/12/01(金) 21:57:09
>>376
これ以上は英語の勉強になってしまう気もするが、直訳の因果関係が逆。
「異なる分け方をしている」→「実装方法と言語の定義に影響を与える」
まああまり細かいことは気にしないで読み進めていけばいいんじゃないだろうか。

なんて言ってる俺も実は読んでる途中だったりする。

378 :363:2006/12/01(金) 22:21:11
>>377
どうもwithとかasみたいな曖昧な前置詞や一つの文の中で,が何度も出てくると
文の構造がよくわからなくなってしまうみたいです。

次のよく意味がとれない文なんですが

PCLの40ページ中段あたり
ttp://www.gigamonkeys.com/book/syntax-and-semantics.html
のS-expressionsとS-expressions As Lisp Formsの中間あたりにある

Two important characteristics of the way the reader translates names to
symbol objects have to do with how it treats the case of letters in names
and how it ensures that the same nameis always read as the same symbol.

の文章なんですが how it treats the case of letters in names をどう訳せば
良いのかよくわかりません。lettersは文字という意味なのかと思ったんですが
名前の中にある文字のケース ではさっぱり意味がわかりません
どういう風に訳せば良いんでしょうか?

379 :デフォルトの名無しさん:2006/12/01(金) 22:32:37
ちょっとひとつひとつの単語(特に前置詞とか)に神経質すぎると思う。
英語なんて気合いだよ。w

ちなみに文字のケースというのは大文字・小文字の区別のこと。

380 :363:2006/12/01(金) 22:44:12
>>大文字・小文字の区別のこと

そんな単純なことだったんですねorz
ちなみに今は1ページ読むのに最低30分かかってるんですが
年内までに読み終わることができるんだろうか・・・

381 :363:2006/12/03(日) 02:36:35
PCL52ページに
(defun verbose-sum (x y)
"Sum any two numbers after printing a message."
(format t "Summing ~d and ~d.~%" x y)
(+ x y))

という関数の定義が載っているんですが、
format関数の中でどうして~%が使われているんでしょうか?
試しに削った状態で関数を呼び出しても同じ結果になるんですが、
どんな意味があるんでしょう?

382 :デフォルトの名無しさん:2006/12/03(日) 02:54:22
知らない単語は辞書を見るように、知らない機能は仕様書を見るべし
http://www.lispworks.com/documentation/HyperSpec/Body/22_cab.htm

383 :363:2006/12/03(日) 03:09:48
>>382
えと、~%の意味(改行する)は知っていたんですが
どうして~%を削って(verbose-sum 1 2)のように呼び出しても
"Summing 1 and 2" 3
という結果にならずに
削らなかったときと同じ
"Summing 1 and 2"
3
という結果になってしまうのかがわからなかったんです。
削っても削らなくても同じ結果になるならなぜ~%をわざわざつけてるんだろうか?と
説明不足ですみませんでした・・

384 :デフォルトの名無しさん:2006/12/03(日) 03:21:16
>>383
君の使っているCommon Lispの処理系は評価値をプリントする前に (fresh-line) を
(内部的に)実行する仕様になっているのだろうね。

385 :363:2006/12/03(日) 03:47:55
1 "Summing〜
を出力する
2 (+ 1 2)
が評価されて3という値になる
3 REPLに出力する前に行の先頭にいなかったら改行する
4 3を出力する

たぶんこんな感じなんですね。
よくわかりました、ありがとうございます。

386 :デフォルトの名無しさん:2006/12/03(日) 05:38:42
Windows用のGNU CLISPでexeファイルが出力できるというので
clisp -c test.lisp -l test.exe

とやってみましたが実行すると 「NTVDM CPUがエラー検出したました」
と出て終わってしまいます。
なにがまずいのでしょうか?


387 :デフォルトの名無しさん:2006/12/03(日) 05:47:35
青汁

388 :デフォルトの名無しさん:2006/12/03(日) 06:00:39
質問なんですが、LispでOSを書く事って出来ないのでしょうか?

389 :デフォルトの名無しさん:2006/12/03(日) 06:06:34
HSPなら書ける。マジレス。

390 :デフォルトの名無しさん:2006/12/03(日) 06:18:48
>>388
書けるけど君には無理

391 :デフォルトの名無しさん:2006/12/03(日) 06:24:01
>>388
一応こんなプロジェクトもあるよ。
http://common-lisp.net/project/movitz/

392 :デフォルトの名無しさん:2006/12/03(日) 06:37:31
なるほど、こんな夜中にすぐレスが付くとは。
じゃあlispでOSを書く場合、JAVAでOSを書くみたいに、
Cでlispインタプリタを作って実行させるのが良いのでしょうか?
Lispでx86のネイティブコードを吐かせるコンパイラって無いのでしょうか?
>>389
HSPって何ですか?
調べたけれど、lispと関係有るのでしょうか?

393 :デフォルトの名無しさん:2006/12/03(日) 08:25:16
OS作ろうってんなら、コンパイラくらい先に作れ。

394 :デフォルトの名無しさん:2006/12/03(日) 10:17:16
末尾再帰を最適化してくれる Common LISP の処理系って
どんなものがありますか?


395 :デフォルトの名無しさん:2006/12/03(日) 10:29:22
>>392 過去の OS は Lisp でネイティブだったね。ハードウェアも専用のもの
だった。ハードウェアによる GC 支援なんかはまた将来復活するかもね。

>>394 ほとんど全部じゃないかな。 CMUCL, SBCL, CLISP, LispWorks, AllegroCL, ...
つうか、これつかえばポータブル。 http://www.cliki.net/org-no-carrier-tail-funcall

396 :デフォルトの名無しさん:2006/12/03(日) 10:39:05
CLISPってwinのexeつくれないんですか?

397 :デフォルトの名無しさん:2006/12/03(日) 10:46:40
作れます。ドキュメントを読んでください。

398 :デフォルトの名無しさん:2006/12/03(日) 12:40:48
sbclについて質問させてください。
a.outやELFのようなファイルを作ることは可能でしょうか。

*.faslや、それをsb-executableで変換したものは出来たんですが、
後者は #!bin/sh からsbclを呼んでいるようですし...。

399 :398:2006/12/03(日) 12:46:19
>394
私はへたれなんでよくわかりませんが、ちょうど昨日末尾再帰で
1億回のループ(ループというのは正しくないかも)を試したところ
だったので書いてみます。

clispはスタックオーバーフロー、sbclは2秒程度でできました。

400 :デフォルトの名無しさん:2006/12/03(日) 12:53:11
英語がよくわかりません。


401 :デフォルトの名無しさん:2006/12/03(日) 13:06:59
>>398
% sbcl --eval '(save-lisp-and-die "hello" :toplevel (lambda () (princ "hello, sbcl") (terpri) 0) :executable t)'
This is SBCL 1.0, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.
[undoing binding stack and other enclosing state... done]
[saving current Lisp image into /tmp/hello:
scanning space for lutexes...
writing 1912 bytes from the read-only space at 0x10000000
scanning space for lutexes...
writing 1936 bytes from the static space at 0x30000000
scanning space for lutexes...
writing 23666688 bytes from the dynamic space at 0x48000000
writing 11 lutexes to the core...
done]
% ./hello --noinform
hello, sbcl
% file ./hello
./hello: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), dynamically linked (uses shared libs), not stripped

402 :デフォルトの名無しさん:2006/12/03(日) 13:46:01
>>395
以前試したときの記憶では、CLISPは末尾再帰は必ずしも最適化されなかったような。

403 :398:2006/12/03(日) 16:19:12
>401さん

どこを見ていいのかわからなかったのですが、おかげでこれを
見つけられました。ありがとうございます。
ttp://www.sbcl.org/manual/Saving-a-Core-Image.html

こんなものがあるなんて...。これを着てれば忘れないかも
ttp://www.cafepress.com/ygingras.18903047

404 :デフォルトの名無しさん:2006/12/03(日) 18:19:31
>>399
どんなコードだったかを秘密にする意図はなんですか?ただの末尾再帰なら
CLISP でも動くよ。だめならループつかえばいいのに。

[1]> (defun foo (n) (if (= n 100000000) t (foo (1+ n))))
foo
[2]> (compile 'foo)
foo ;
nil ;
nil
[3]> (foo 0)
t


405 :デフォルトの名無しさん:2006/12/03(日) 18:48:20
末尾再帰で書いていないに一票


406 :398:2006/12/03(日) 19:11:12
私は (compile 'hoge) をしてませんでした。
これによって挙動が違うんですね。

;; clisp
[1]> (defun hoge (x) (if (= 0 x) nil (hoge (- x 1))))
HOGE
[2]> (hoge 100000000)

*** - Lisp stack overflow. RESET

sbclは大丈夫っぽい
;; sbcl
* (defun hoge (x) (if (= 0 x) nil (hoge (- x 1))))

HOGE
* (hoge 100000000)

NIL

407 :デフォルトの名無しさん:2006/12/03(日) 19:22:05
それはコンパイルしないとインタプリタで実行されるからだよ。バイトコード
にコンパイルされる時に最適化が効くようになってる。コンパイル時に最適化
するデバッグとかするときにね。

SBCL はコンパイラのみなので、いきなりコンパイルしちゃって最適化されてる。
インタプリタ実装されてるよ。まだデフォルトじゃないけど設定でインタプリ
タも使えるようになるよ。

408 :398:2006/12/03(日) 19:27:47
おお、ありがとうございます。勉強になります。
>394
混乱させるような事を言ってすいません。

409 :デフォルトの名無しさん:2006/12/03(日) 19:55:38
SBCL 1.0 ならもう入ってるのでインタプリタ使いたければ↓のようにしてくれ。
つうか Scheme から来た人? CL は「いつも必ず末尾再帰を最適化する」じゃない
ので適宜ループとか使ったほうがいいよ。

CL-USER> (setf SB-EXT:*EVALUATOR-MODE* :INTERPRET)
:INTERPRET
CL-USER> (defun foo (n) (if (= n 100000000) t (foo (1+ n))))
FOO
CL-USER> (foo 0)

Control stack exhausted (no more space for function call frames). This is probably due to heavily nested or infinitely recursive function calls, or a tail call that SBCL cannot or has not optimized away.
[Condition of type SB-KERNEL::CONTROL-STACK-EXHAUSTED]

Restarts:
0: [ABORT-REQUEST] Abort handling SLIME request.
1: [TERMINATE-THREAD] Terminate this thread (#<THREAD "repl-thread" {D08EBE1}>)


410 :363:2006/12/03(日) 20:09:16
次の意味がよくわからない文なんですが

PCLの59ページ
ttp://www.gigamonkeys.com/book/functions.html
Functions As Data, a.k.a. Higher-Order Functionsの真上にある文全体を要約すると

1 たしかにRETURN-FROM関数の引数に返る関数の名前を書くのはしんどい。
  関数の名前を変更したら同じようにRETURN-FROM内で使われてる名前も変更しなくちゃいけない。

2 でもLispではCから派生したreturnステートメントよりも明示的にRETURN-FROMを指定するほうが
 多く使われる場合がある。

3 何故ならloop等の制御構造を含む全てのLisp式は評価されると値になるから。

4 だから実際はそんなに問題じゃない。

という風に訳せたんですが、いまいち3の部分がよくわかりません。
どうして制御構造を含むLispの式を評価すると値になる事と
1に書かれている事がたいした問題ではないことに繋がるんでしょうか?

411 :デフォルトの名無しさん:2006/12/03(日) 20:14:17
C だと値を返すには return をしないといけない。

Lisp では制御構造を評価すると勝手に値が返るのでいちいち return をかか
なくてよい

だから return を書くのが多少面倒でも実質的に問題にならない(C と同等の
意味なら return そもそもを書く必要がないから)




412 :363:2006/12/03(日) 20:47:58
>>411
よくわかりました。ありがとうございます。
どうも文の中にあるmuch less(はるかに少ない)を(言うまでもなく)と
間違って訳したせいで意味がまったく逆になってたせいみたいです。
2の正しい訳は
× RETURN-FROMのほうが多く使われる
ではなくて
○ C系の言語でRETURN文が使用されるほどにはLispではRETURN-FROMは使用されない
ですねorz

413 :398:2006/12/03(日) 21:38:27
>409
確かにそうなりました。ありがとうございます。

clispもsbclもこうなっていたのか
> コンパイルされる時に最適化が効くようになってる。by 408

414 :398:2006/12/03(日) 21:39:09
あれ、by 407だった。

415 :407:2006/12/03(日) 22:43:05
>>398 「常に末尾再帰は最適化されるべき」と考えるあたり Schemer だと思うけど、
CL やるときは頭を切り替えたほうがいいよ。この辺 C から入った人なんかだと
「コンパイルする == 最適化」が普通だと感じるようだけど。

416 :デフォルトの名無しさん:2006/12/03(日) 22:45:05
Common Lisper なら高機能な loop 構文ですよw

417 :デフォルトの名無しさん:2006/12/04(月) 01:11:53
WINのCLISPで実行ファイルを作るにはどうすればいいのでしょうか?


418 :デフォルトの名無しさん:2006/12/04(月) 01:42:19
コンパイルした実行ファイルで標準出力に文字を出力
するにはどの関数を使えばいいのでしょうか?


419 :デフォルトの名無しさん:2006/12/04(月) 02:24:55
write-char

420 :デフォルトの名無しさん:2006/12/04(月) 02:52:23
*.fas を windows用のexecutableにするにはどうすればいいのですか?


421 :デフォルトの名無しさん:2006/12/04(月) 04:36:45
CLISPで単にWINのDOS窓用のexeを作りたいのですが
(SAVEINITMEM "test" :EXECUTABLE t)
とやるとCLISPのインタプリタまでつくられてしまいます。
Cやhaskellみたく普通のexeは作れないのですか?


422 :デフォルトの名無しさん:2006/12/04(月) 04:47:12
インタプリタ、じゃなかった。
対話形式の実行環境、とでもいいましょうか。




423 :デフォルトの名無しさん:2006/12/04(月) 08:54:33
(quit)

424 :デフォルトの名無しさん:2006/12/04(月) 14:03:12
できるようになりましたが
全部4メガバイトになっちまいます。
しかも他のPCに持っていくとDLLがない、とかいういつものやつで。
やっぱりLISPってなんだかな〜

425 :デフォルトの名無しさん:2006/12/04(月) 14:10:04
言語と処理系を一緒にするなよ
アホ

426 :デフォルトの名無しさん:2006/12/04(月) 14:18:15
一緒にして考えろよタコ



427 :デフォルトの名無しさん:2006/12/04(月) 16:56:26
結局>>424の最後の1行が書きたいだけのキチガイ君でしたね。
皆様の放置プレイがGJです。

428 :デフォルトの名無しさん:2006/12/04(月) 18:19:10
DLLがない、とかいういつものやつ

いつものやつ

???

429 :デフォルトの名無しさん:2006/12/04(月) 18:48:09
>>424
君にはコーマンテクノロジズ社のコーマンリスプをお勧めしておこう
http://www.cormanlisp.com/

430 :デフォルトの名無しさん:2006/12/04(月) 21:15:48
普通のやつらの上を行きたいので、
オモチャの笛で電話機をハックするところから始めようと思います。

431 :デフォルトの名無しさん:2006/12/04(月) 21:37:44
キャプテンクランチ キター

432 :363:2006/12/04(月) 22:38:19
次の意味がよくわからない文章なんですが

PCLの73ページ
Dynamic, a.k.a. Special, Variables の最後の方にあるダイナミック変数についての説明

1 Dynamic bindings make global variables much more manageable,
(訳)動的束縛をつかうとグローバル変数がもっと便利になる。
2 but it's important to notice they still allow action at a distance.
(訳)しかし離れた所からのアクションをまだ許可していることに気づくのは大切です。
3 it can change the behavior of downstream code,and it also opens the possibility that downstream code
will assign a new value to a binding established higher up on the stack.
(訳)ダウンストリームとは?? 可能性を開く??
4 文章略
(訳)動的変数を使うときはこれらの利点が必要なときのみにすべきでしょう。

2の文章もいまいち良く訳せていないみたいなんですがそれよりも3の文章が問題で
4の文章からすると3で動的変数の利点を説明してるみたいなんですが、
ダウンストリームという言葉を辞書で調べても下流のという意味にらしく
3の文章とどのように組み合わせるのかがいまいちよくわかりません。
3の文章はどういうことを説明してるんでしょうか?


433 :デフォルトの名無しさん:2006/12/05(火) 01:43:26
ここでいうdownstream codeってのはその束縛の中で実行されるコードで、
let文の中だけでなくそこから呼ばれる関数も含んだものを指している。

> Dynamic bindings make global variables much more manageable, but it's
> important to notice they still allow action at a distance. Binding a
> global variable has two at a distance effects--it can change the
> behavior of downstream code, and it also opens the possibility that
> downstream code will assign a new value to a binding established higher
> up on the stack. You should use dynamic variables only when you need to
> take advantage of one or both of these characteristics.

動的束縛によりグローバル変数はずっと扱いやすくなる。それでも
グローバル変数が離れた場所から操作できてしまう点に注意は必要だ。

[つまり、(let ((*global-var* hoge)) ...) とすると、 ... の中だけでなく
そこから呼ばれた関数でも*global-var*をsetfできてしまうことを指している。]

グローバル変数を束縛することは、2つの遠隔効果をもたらす。すなわち
一つは下流のコード [ 束縛したletの中、および、実行時にそこから呼ばれた
コード。 ] の振舞いを変え得ることで、もう一つは動的束縛では下流のコードも
スタックの上流で行われた束縛の値を変更することができるということだ。

この2つの性質のどちらかを利用する必要がある場合に限り、動的変数を
使うとよいだろう。

434 :デフォルトの名無しさん:2006/12/05(火) 01:45:08
こういう質問のときは文脈がわかるようある程度のまとまりで切り出して
もらった方が答えやすい。PCLはwebで見れたからいいけど、本だとそうはいかない。

435 :デフォルトの名無しさん:2006/12/05(火) 04:17:04
アスペクト指向プログラミングって、EmacsのadviceとかCLOSのauxiliary method
とかを後からねじこんだようなものかな?

436 :363:2006/12/05(火) 09:34:45
>>433
よくわかりました。ありがとうございます。
今日はいよいよマクロの章に突入だ。がんばるぞ(`・ω・´)

437 :デフォルトの名無しさん:2006/12/05(火) 12:16:18
>>424
>君にはコーマンテクノロジズ社のコーマンリスプをお勧めしておこう
>http://www.cormanlisp.com/

よくわからないけどありがとうございます。これお金取るんですか?


438 :デフォルトの名無しさん:2006/12/05(火) 21:42:14
何で自分で調べないの?

439 :デフォルトの名無しさん:2006/12/07(木) 01:55:33
めんどくさいからです。

440 :デフォルトの名無しさん:2006/12/07(木) 02:42:35
面倒だからって他人に求めるのはどうよ?
それくらい自分でやろうよ。

441 :デフォルトの名無しさん:2006/12/07(木) 17:59:36
もうほっとけ

442 :デフォルトの名無しさん:2006/12/08(金) 23:00:12
WIN用のGCLでOSのコマンドとか呼ぶ関数って
無いんですか?

443 :デフォルトの名無しさん:2006/12/09(土) 01:06:56
何で自分で調べないの?

444 :デフォルトの名無しさん:2006/12/09(土) 01:08:14
めんどくさいからです。

445 :デフォルトの名無しさん:2006/12/09(土) 01:20:55
面倒だからって他人に求めるのはどうよ?
それくらい自分でやろうよ。

446 :デフォルトの名無しさん:2006/12/09(土) 01:36:13
もうほっとけ

447 :デフォルトの名無しさん:2006/12/09(土) 02:51:54
おまえら・・・

448 :デフォルトの名無しさん:2006/12/09(土) 05:26:40
LISPコミュって最高(プ

449 :デフォルトの名無しさん:2006/12/09(土) 11:02:23
CやJavaで簡易な言語(というか設定用コマンド)をつくるときは、lex/yacc or JavaCCを使います。
一方で、Lispだったら、どうつくるのが常套手段なのでしょうか。
たとえば、以下のようなコマンドをlispで実装するのは?
---------
copy file1 file2
move file1 file2
remove file1
-----
ちなみにyaccだとこんな風に書いていく。
list :
| list cmn NL
;
cmnd : COPY source target { action...}
| MOVE source target {action...}
......

450 :デフォルトの名無しさん:2006/12/09(土) 11:30:19
普通はさくっとrecursive-descentに書いちゃうんじゃない?
parser generatorが使いたければcl-yaccとかもある。

451 :デフォルトの名無しさん:2006/12/09(土) 12:54:35
設定用コマンドも S 式にすれば read() で ok

452 :デフォルトの名無しさん:2006/12/09(土) 14:41:53
lisp スレだと "(w"
の括弧が閉じなくてキモイ))

453 :デフォルトの名無しさん:2006/12/09(土) 16:05:20
emacs+sbcl+slimeをインストールしました。
http://lispuser.net/memo/lisp/2006-12-08-03-54.html
を実行しようとしてつまずいています。

slimeを立ち上げて、コードのバッファをslime-modeにして、
C-c C-cでバッファのソースをコンパイルして、.faslというものができたのですが、
これをどう実行するべきでしょうか?
また、C-c C-lでロードしたつもりなのですが、
slimeのreplで、(repl)と入力してみても、(init)が定義されていないといわれます。
initのリストの後ろでC-x C-eとやっているのですが。。。

454 :デフォルトの名無しさん:2006/12/09(土) 16:18:12
>>453
パッケージが違うからだね。

CL-USER> (minilisp::repl)

もしくは、

CL-USER> (in-package :minilisp)
MINILISP> (repl)

で動くよ。でも元記事、どうみても書きかけなんだけどw

455 :453:2006/12/09(土) 16:27:05
>>454
起動できました。ありがとうございます。

456 :デフォルトの名無しさん:2006/12/09(土) 19:06:55
本家のgoogleでPCLを検索すると、3番目にPeter Seibelさんが
スピーチしてる動画があるんですが、どんなこと見たことある人いますか?

457 :デフォルトの名無しさん:2006/12/09(土) 19:07:58
×どんなこと
○どんな内容なのか
ですねorz

458 :デフォルトの名無しさん:2006/12/09(土) 20:42:40
なんにでもカッコつけたがるのって
あれだ、ほら
ゴルフのスイングしてるオヤジとかギターのストロークの真似してる
ニーチャンといっしょ。

459 :デフォルトの名無しさん:2006/12/09(土) 20:53:27
よれよれスーツのオヤジとかアキバ系ファッションのニーチャンとか
もう少しカッコに関心を持ってもいいんじゃないかと思うな。

460 :デフォルトの名無しさん:2006/12/09(土) 21:10:05
わかりはじめたへたくそほどああいうことやるわね。


461 :デフォルトの名無しさん:2006/12/09(土) 21:20:17
>>459
あえて「プログラマとか」って表現を避けてるなお前w

462 : ◆6SE0.gfVLs :2006/12/09(土) 21:51:35
>>451
それこそ、lispスレならではの回答だな。

463 :363:2006/12/12(火) 16:42:47
155ページまでなんとか進んだんですが、また意味がよくわからない
文章が出てきました。

PCLの155ページ
http://www.gigamonkeys.com/book/beyond-lists-other-uses-for-cons-cells.html
のSetsの少し上にある文章。

Where a cons cell in the original referenced an atomic value, the corresponding
cons cell in the copy will reference the same value.Thus,the only objects referenced
in common by the original tree and the copy produced by COPY-TREE are the numbers
5,6,and the symbol NIL

(訳)オリジナルのコンスセルが参照したアトム値は、対応するコピーされたコンスセルも同じ値を
参照します。従って、オリジナルのツリーとコピーされたツリーによって共通に参照される
オブジェクトは5,6,シンボルNILだけになります。

という風に訳したんですが、何度読んでもどうして5,6,NILだけが共通して参照されるのかが
よくわかりません。1,2,3,4,が共通して参照されないのは何故なんでしょうか?

464 :デフォルトの名無しさん:2006/12/13(水) 00:44:10
共通して参照されると思うよ。
前半と後半が矛盾してるよね。後半が間違っているのでは。

465 :デフォルトの名無しさん:2006/12/13(水) 01:20:28
漏れもerrata確認してみたけど該当する記述ないね。
Peterに直接訊いてみたら?

466 :デフォルトの名無しさん:2006/12/13(水) 16:34:46
いつのまにかアレグロが8.0になっていた・・・
なんか簡為DBもついてくるようなので落として遊んでみるか

467 :363:2006/12/13(水) 20:45:31
>>464,465
うーん、やっぱり本の間違いなんですかね。
リーディング以上にライティングが苦手な自分にはApressにメールするには
勇気が入りますorz

468 :デフォルトの名無しさん:2006/12/14(木) 00:00:22
>>464 に同意

469 :デフォルトの名無しさん:2006/12/14(木) 00:23:10
CMUCLでの定義
ttp://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))

470 :デフォルトの名無しさん:2006/12/14(木) 13:49:07
fixnum は外部に実体が無いから「共通して参照される」ことはないよね。
とすると 5 6 が変なんだけど
* 原稿では 5.0 6.0 になってたのが校正の段階で落ちてしまった
* 5 以上は bignum として読んでくれということになってる (ざっと見た
感じではそのような指定は見付からないけど)
みたいな感じなのかなあ。質問メール出すのがいいと思うよ。

471 :デフォルトの名無しさん:2006/12/14(木) 14:00:32
日本語版出そうとしてる出版社ないのかな。もしあればそこを経由して伝えるのも手だ。

472 :デフォルトの名無しさん:2006/12/14(木) 17:08:03
>>470
immutableな値でも概念的には「共通して参照される」で構わないだろう。
どのみちそんなことは話の本質にはなんら関係なく、的外れもいいところ。

fixnumだろうがbignumだろうが何かのクラスのオブジェクトだろうが、
copy-treeがそれを複製する能力を持たないという点だけが必要なのだから。

473 :デフォルトの名無しさん:2006/12/14(木) 20:15:09
>>472
「概念的」だと曖昧過ぎるんで「言語仕様的」に落として
「共通して参照される」は相互に eq なオブジェクト
「複製」は相互に equal だけど eq でないオブジェクト
でいい?

474 :デフォルトの名無しさん:2006/12/15(金) 01:48:52
>>467
#lisp に行ったついでに聞いてみたら
<jsnell> I don't see why 1-4 wouldn't be included
だってさ。やっぱ Peter にきくのがいいと思う。
俺の英語ですら通じてるみたいだし、何とかなるよ。

475 :デフォルトの名無しさん:2006/12/15(金) 04:00:45
#lispって・・・なに?

476 :デフォルトの名無しさん:2006/12/15(金) 04:15:31
>>475
ttp://www.cliki.net/IRC

477 :363:2006/12/15(金) 19:24:01
Apressに出すメールを↓のように書いてみたんですが

件名 Question to Practiacal Common Lisp

本文

There was a point that did not understand now though I was reading Practical Common Lisp.
May I ask question on this point ?
The point is a part of "Thus,the only objects referenced in common by the original tree and the copy
produced by COPY-TREE are the numbers 5, 6, and the symbol NIL."on page 155.
Why are not the numbers 1,2,3,4 referenced in common ?
I am not good at English because I am Japanese... therefore I am afraid of not writting this Email well.
But I think that this book is wonderful. And, it get me to send E-mail
I'm looking forward to receiving reply.

name addres

こんな感じの文章で良いんでしょうか?



478 :デフォルトの名無しさん:2006/12/15(金) 20:51:50
>>477
せっかくの2chだし、英語板にいって聞いてみるのがいいんじゃない?

479 :デフォルトの名無しさん:2006/12/15(金) 23:51:01
>>474
SBCL デベロッパ就任おめでとうございます。
日本語が使えるようになって助かってまつ。

480 :363:2006/12/16(土) 20:34:32
書きかけで保存してたつもりがいつの間にか送信されてたみたいですorz
それでPeterさんから返事があったんですが、やっぱり間違いだったそうで
後でerrataに追加するそうです。

481 :デフォルトの名無しさん:2006/12/16(土) 21:58:37
すばらしー、ナイス480。
Peterからの返事いいなぁ。

482 :デフォルトの名無しさん:2006/12/17(日) 18:37:26
Peterはgigamonkeyにメールすれば結構レスポンス良く返事くれるよ。
いますぐ回答できないから後でまた連絡するね、って返事がきたときは
大抵催促しないとその先の返事が戻って来ないけど。

483 :363:2006/12/21(木) 01:51:23
lispboxの中のpracticalsディレクトリにあるreadmeファイルの文章で
よくわからない点があるのですが

The code is designed to be loaded with Another System Definition Facility (ASDF)
and each chapter directory contains its own ASD file. You can either add the
name of each ChapterXX directory to ASDF:*CENTRAL-REGISTRY* or you can create
symlinks to the ASD files in those directories in a directory that is already
named in ASDF:*CENTRAL-REGISTRY*. If you also add this directory to the central
registry or create a symlink to the file practicals.asd, you can then load all
the practicals code by typing:

(訳)そのコードはASDFでロードするようにデザインされてます。そして章ごとの
ディレクトリも自分自身のASDファイルを持ってます。あなたはASDF:*CENTRAL-REGISTRY*に
CHAPTERXXの名前を追加しても良いし〜(略)REPL上で次のようにタイプすることで
コードをロードすることができます。
(asdf:oos 'asdf:load-op :practicals)

という風に訳したんですが、ASDF:*CENTRAL-REGISTRY*とは一体何なんでしょうか?
ファイルかディレクトリの名前かと思って探してみたんですがどこにも見つかりませんでした。

484 :デフォルトの名無しさん:2006/12/21(木) 03:27:32
どっかにそゆパッケージがあるんだべ

485 :デフォルトの名無しさん:2006/12/21(木) 05:09:37
>>483
ASDF パッケージの *CENTRAL-REGISTRY* 変数のこと。
http://www.cliki.net/asdf

486 :デフォルトの名無しさん:2006/12/21(木) 09:54:36
>>483
なんでそこでASDFというモノを調べない……

487 :363:2006/12/21(木) 16:52:25
非標準のライブラリだったんですね
CLtL2とかHyperSpecばっかり探してましたorz

それで色々と試しているんですがよくわからない部分が出てきました。
WindowsとClispが入ったlispboxで試していて、
(asdf:operate 'asdf:load-op :practical)とタイプすると全てのソースコードがロードされて、
:practicalの代わりに個々の章のasdファイル名を入力するとその章のソースコードがロードされると
といったことがREADMEに書いてあるんですが、特定の章の.asdファイルをロードしようと
するとASERVEが見つかりませんといったエラーが出てしまいます。
エラーが出る章のasdファイルの中にある(require :aserve)が原因だと思うんですが、
どうすればロードできるようになるんでしょうか?


488 :デフォルトの名無しさん:2006/12/21(木) 19:20:08
だったらその章を読めよ。そしたらAllegroServeに言及してあるのがわかるだろ……。
いやはや、ゆとり教育おそるべし。

489 :363:2006/12/22(金) 00:43:16
>>488
366ページに書いてありました。もう少し調べてから質問すべきでしたね。すいません

それで書いてある通りに(load "portableaserve-20051204.214932/INSTALL.lisp")と
REPL上で入力してみたんですが、ロードの途中で

READ from #<INPUT BUFFERED FILE-STREAM CHARACTER
#P"C:\\Program Files\\lispbox-0.7\\portableaserve-20051204.214932\\aserve\\main.cl"
@1525>: #1=#<PACKAGE SOCKET> has no external symbol with name "IPADDR-TO-DOTTED"
[Condition of type SYSTEM::SIMPLE-PACKAGE-ERROR]

というエラーが出て中断してしまいます。
main.clファイルの1525行目でexternされてないシンボルを使用してるのかな?
と考えて/acl-compat/clisp/acl-socket.lispの中を見てみたりもしたんですが
具体的にどうすればエラーが出なくなるのか検討もつきませんorz
環境は上で挙げたようにWindows+CLispのlispboxなんですが
誰か同じ様なエラーが出た人はいないでしょうか?


490 :デフォルトの名無しさん:2006/12/22(金) 02:08:51
AllegroServe 使いたいなら ACL 8.0 Express 使うほうがいいんじゃない?
SBCL でもいいけど、まず Lisp に慣れないと AllegroServe を入れられないよ
うな気がする。CLISP だとシングルスレッドだから Aserve を起動したら
SLIME とまっちゃうし。

# ちなみに ACL, LispWorks, SBCL と試したけど全部 OK だった


491 :363:2006/12/22(金) 20:15:04
>>490
うーん
http://www.gigamonkeys.com/book/lispbox/
をみると28章と29章でマルチスレッドのサポートが必要になると書いてあるんですよね
でも26章の時点でaserveが要求されていて、特にCLispに対しての記述がないという
ことは、少なくともロードするだけでエラーが出るのは何か問題があるんですよね。

日本仕様のWindowsを使ってるのが問題なのかなorz

492 :cream:2006/12/29(金) 11:50:36
ビギナーです。
文字列:"abc"からアトム:abc を得る方法はあるのでしょうか?

欲しいのは、(#\a #\b #\c)や#(#\a #\b #\c)でなくabc です。
よろしくお願いします。

493 :デフォルトの名無しさん:2006/12/29(金) 12:07:56
intern

494 :デフォルトの名無しさん:2006/12/29(金) 12:08:08
(intern "ABC" :keyword)

495 :cream:2006/12/29(金) 12:22:03
早速の回答、どうも有り難うございます。
おかげで問題が解消しました。

496 :cream:2006/12/29(金) 13:09:26
intern の結果について少々質問があります。
CLISP での実行結果は以下の通りになっています。
前者の「あ」は期待通りでしたが、後者の「about」は前後には不要な | がついています。
これを無くすにはどうすればよいのでしょうか?
以上、よろしくお願いします。

[66]> (intern "あ")
あ ;
:INTERNAL
[67]> (intern "about")
|about| ;
:INTERNAL

497 :デフォルトの名無しさん:2006/12/29(金) 13:25:26
>>496
不要じゃないから。

498 :デフォルトの名無しさん:2006/12/29(金) 13:29:11
>>496
> これを無くすにはどうすればよいのでしょうか?

(intern "ABOUT")

499 :cream:2006/12/29(金) 13:49:29
分かりました。
連想配列の car に about としていたところを |about| に変更したりすべきのようですね。
どうも、有り難うございます。

139 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)