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| に変更したりすべきのようですね。
どうも、有り難うございます。

500 :デフォルトの名無しさん:2007/01/01(月) 02:27:13
質問です。
lispは人工知能用の言語と聞きました。
でも、なかなか日本語に対応していないみたいです。
1、windowsで問題なく日本語を使える。
2、日本語を問題なく処理できる
3、インタープリタでなくバイナリをつくる。
そんな処理系って有りますでしょうか?

501 :デフォルトの名無しさん:2007/01/01(月) 02:31:00
どの処理系を使ってダメだと思ったのか詳しく

502 :デフォルトの名無しさん:2007/01/01(月) 03:40:05
haskellですけどghcは駄目でした。
試したわけではありませんが、テンプレを読んだ限り、
SBCLはSJISが使えない。
CLISPはバイナリがつくれない。
ABCLは良い感じですが、javaをインストールしないといけない。
Windowsでバイナリをはくlispの処理系って他に何が有りますでしょうか?

503 :デフォルトの名無しさん:2007/01/01(月) 07:17:30
>>502
一行目を言いたいことがよく判らないので措くとしても、
用途というか目的が判らないので何とも言えないけれど。
実行効率が問題? それともユーザの環境の問題?
そもそもバイナリってネイティヴコードのこと? ……なら abcl は一応駄目だよね。
ていうか abcl がいい感じならそれでいいんじゃないかと思うのだけれど、
java をインストールできない事情でもあるのん?

まあ諸々措いて。
とりあえず clisp でスタンドアローンな exe は作れるよ。

http://clisp.cons.org/impnotes.html#image
> :EXECUTABLE
> When non-NIL, the saved file will be an standalone executable.
> In this case, the #P".mem" extension is not added.
> On Win32 and Cygwin the extension #P".exe" is added instead.

sbcl も今は sjis 扱えるはずだよ。

http://article.gmane.org/gmane.lisp.steel-bank.devel/7820

それはそうと皆さん明けましておめでとう。

504 :デフォルトの名無しさん:2007/01/01(月) 08:05:46
明けましておめでとうございます。
>>503
回答有難うございます。
出来たバイナリを配布したいんです。
で、プラットフォームはwindowsで、なるべく、「hogeをインストールしないと使えない」という
状態を避けたいんです。
バイナリはネイティブコードの事です。
clispはスタンドアローンなプログラム、作れるんですね。
有難うございました。

505 :デフォルトの名無しさん:2007/01/03(水) 16:17:02
CLISPで文字列を数値に変える関数は何でしょう。
guy steeleの仕様書を読んでみましたが見つかりません。
AutoLispだとatoi
Emacsだとstring-to-numberというのがあるようですが

506 :デフォルトの名無しさん:2007/01/03(水) 16:31:56
わかりました。
(read-from-string "12345")
とかやればいいんですね。


507 :デフォルトの名無しさん:2007/01/04(木) 15:13:17
>>88
以前のレスへのレスになるが、昨日見たら復活していた
ttp://www.is.s.u-tokyo.ac.jp/~vu/97/jugyo/processor/compilerresume/index.html

508 :デフォルトの名無しさん:2007/01/04(木) 15:18:42
新しいURLに移っていた(と書き忘れた)
ttp://www.is.s.u-tokyo.ac.jp/vu/96/cad/compilerresume/index.html

509 :デフォルトの名無しさん:2007/01/05(金) 04:36:22
素晴らしい。

510 :デフォルトの名無しさん:2007/01/05(金) 04:57:18
LALRとかってむずいよね

511 :デフォルトの名無しさん:2007/01/15(月) 16:43:17
神降臨
http://itpro.nikkeibp.co.jp/article/NEWS/20061228/258033/

512 :デフォルトの名無しさん:2007/01/15(月) 20:14:25
よく使うのに何の言葉の省略なのかわからない関数があるんですが
letというのは何の略なんでしょうか?

513 :デフォルトの名無しさん:2007/01/15(月) 20:23:29
省略じゃなくて、英語のletだよ。

514 :デフォルトの名無しさん:2007/01/15(月) 22:37:58
(let ((it be))

515 :デフォルトの名無しさん:2007/01/16(火) 11:01:12
(let ((us (go))))

516 :デフォルトの名無しさん:2007/01/17(水) 00:22:50
ツンデ let

517 :512:2007/01/18(木) 01:17:59
>>513
シンプルに貸すっていう意味だったんですねorz

518 :デフォルトの名無しさん:2007/01/18(木) 01:58:50
貸す?ココのletは英辞郎 on the Webでいう↓の意味だよ。
そのまんま一時変数の導入の為に使われるマクロの名前になってる。

【他動-3】 仮に〜としよう
・ Let x = 5, y = 7. 《数学》x を5、y を7としましょう。

519 :デフォルトの名無しさん:2007/01/19(金) 03:43:57
そう言う問題じゃネーだろ

520 :デフォルトの名無しさん:2007/01/19(金) 15:40:10
letは関数じゃないぞ

521 :デフォルトの名無しさん:2007/01/20(土) 10:18:57
loopは関数じゃないぞ

522 :デフォルトの名無しさん:2007/01/20(土) 10:48:51
Lispが広まらないのには括弧以外の理由があるのかもね。

523 :デフォルトの名無しさん:2007/01/20(土) 13:55:32
他の手続き型programg言語で書いた方が楽な処理を
S式で記述するとシンドイじゃない

524 :デフォルトの名無しさん:2007/01/20(土) 15:34:06
>>523
ほほう。そうゆうものかな。参考にしたいので、なんか具体例だしてよ。

525 :デフォルトの名無しさん:2007/01/20(土) 15:49:08
#!/Perl/bin/Perl
$jane2ch_ini='E:/openjanedoe-0.1.12.2/JANE2CH.ini';
open(INPUT, $jane2ch_ini) || die "Couldn't open $jane2ch_ini for reading: $!\n";
@lines = <INPUT>;
close INPUT;
($jane2ch_bak = $jane2ch_ini) =~ s/\.ini$/\.bak/i;
rename($jane2ch_ini, $jane2ch_bak) or
  die "Couldn't rename $jane2ch_ini to $jane2ch_bak: $!\n";
open(OUTPUT, "> $jane2ch_ini") || die "can't open $jane2ch_ini for writting: $!\n";
foreach (@lines) {
  chomp;
  print OUTPUT $_;
  if (/^WrtCookie\s*=(.+)$/) {
      unless ($1 =~ /hana\s*=\s*mogera\s*;/) {
      print OUTPUT " hana=mogera;";
    }
  }
  print OUTPUT "\n";
}
close OUTPUT;

526 :デフォルトの名無しさん:2007/01/20(土) 15:49:38
>>523
単に不慣れなのでは?

527 :デフォルトの名無しさん:2007/01/20(土) 15:50:45
>>525
何が書いてあるのか俺には理解できないが、S式で書いてくれれば
一兆倍くらいはわかりやすそうだな。

528 :デフォルトの名無しさん:2007/01/20(土) 15:53:20
>>525
-iつかって一行でかけるな

529 :デフォルトの名無しさん:2007/01/20(土) 15:59:15
perl -p -i.bak -e 's/^WrtCookie.*$/& hana=mogera;/' E:/openjanedoe-0.1.12.2/JANE2CH.ini
こうか

530 :デフォルトの名無しさん:2007/01/20(土) 16:17:08
# Haskell qsort:

qsort []     = []
qsort (x:xs) = qsort elts_lt_x ++ [x] ++ qsort elts_greq_x
               where
                 elts_lt_x   = [y | y <- xs, y < x]
                 elts_greq_x = [y | y <- xs, y >= x]

# perl qsort:

sub qsort {
  !@_ ? () : (qsort(grep { $_ < $_[0] } @_[1..$#_]),
             $_[0],
             qsort(grep { $_ >= $_[0] } @_[1..$#_]));
}

こういうのは、まだfunctionalな言語で書いた方が楽だな

531 :デフォルトの名無しさん:2007/01/20(土) 16:23:26
;;; scheme qsort:

(define (qsort lt? lst)
  (if (null? lst) '()
   (append
    (qsort lt? (list-of x (x in (cdr lst)) (lt? x (car lst))))
    (list (car lst))
    (qsort lt? (list-of x (x in (cdr lst)) (not (lt? x (car lst))))))))

こうか…
qsortに関してはperl版が一番好みだな、困ったことに

532 :デフォルトの名無しさん:2007/01/20(土) 16:25:47
いけねぇlist-of使ってるのコピペしちまった...orz

533 :デフォルトの名無しさん:2007/01/20(土) 16:27:55
;;; scheme qsort:

(define (qsort ls)
 (if (<= (length ls) 1) ls
  (let ((pivot (car ls)))
   (append (qsort (filter (lambda (n) (< n pivot)) ls))
           (filter (lambda (n) (= n pivot)) ls)
       (qsort (filter (lambda (n) (> n pivot)) ls))))))

こうだな、
ttp://d.hatena.ne.jp/MaD/searchdiary?word=*%5BScheme%5D

534 :デフォルトの名無しさん:2007/01/20(土) 16:47:15
// C qsort:
void qsort(int v[], int left, int right) {
  int i, last;
  void swap(int v[], int i, int j);
  if (left >= right) return;
  swap(v, left, (left + right)/2);
  last = left;
  for (i = left + 1; i <= right; i++)
    if (v[i] < v[left])
      swap(v, ++last, i);
  swap(v, left, last);
  qsort(v, left, last-1);
  qsort(v, last+1, right);
}
これで十分いけてるやん

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


536 :デフォルトの名無しさん:2007/01/20(土) 17:12:32
行の少なさではこれがチャンピオンか…

qsort [] = []
qsort (x:xs) = qsort [y | y <- xs, y < x] ++ [x] ++ qsort [y | y <- xs, y >= x]


537 :デフォルトの名無しさん:2007/01/20(土) 17:13:52
>>524
つうことで、もういいかな

538 :524:2007/01/20(土) 21:28:10
よーわからん。別に S 式で書いてもシンドイとは思わんが・・・
(defpattern qsort
() -> ()
(x . xs) -> (concat (qsort (list-of xs (lambda (y) (< y x))))
(list x)
(qsort (list-of xs (lambda (y) (>= y x))))))


539 :524:2007/01/20(土) 21:49:35
あ、 一行野郎のほうか?そりゃ俺も Perl で書くわ…。
手続き言語つーより Perl の一行野郎への適性だろ。

540 :デフォルトの名無しさん:2007/01/20(土) 21:56:35
>>538
ほーこう書けるんだ、参考になる
これならさほどしんどくないな

541 :デフォルトの名無しさん:2007/01/20(土) 22:01:02
再帰の出る幕じゃない例をまな板に載せた方が
もうすこしはっきりしたかもな

542 :デフォルトの名無しさん:2007/01/20(土) 22:44:13
Schemeだと
((if true + -) 1 2)
はOKなのに
Common Lispだとできないのはどうしてなんでしょうか?

543 :デフォルトの名無しさん:2007/01/20(土) 22:50:12
こうすりゃできる。
(funcall (if true #'+ #'-) 1 2)

funcall を付けなきゃならん理由は、たぶん可読性がいいからだと思う。

544 :デフォルトの名無しさん:2007/01/20(土) 22:54:44
>>543
可読性のためだったんですね。よくわかりました、ありがとうございます。
あと勉強のためのLispインタプリタを作ろうと思ってるんですが
前置記法じゃなくて中置記法にした場合、○○ができなくなる。
というようなことはあるんでしょうか?

545 :デフォルトの名無しさん:2007/01/20(土) 23:03:17
可読性のためじゃない
普通のLispはcar部を評価しないから

546 :デフォルトの名無しさん:2007/01/20(土) 23:11:40
Common Lisp では関数呼び出しの先頭はシンボル(関数名、マクロ名、スペシャルフォーム名)かラムダ式
じゃないといけないと規定されているから。

そうなっている理由は、それだとネストが深くなったら見難いとかだろ。
((((foo) 1) 2) 3)
明示したほうがいい。
(funcall (funcall (funcall (foo) 1) 2) 3)
まぁ、チームでやってるときに「開き括弧を数えてください」と「funcall の数を数えてください」のどっちが
言いやすいかって話だよな。

後者が許せないなら Scheme 使うほうがいいと思うよ。
どうしても Common Lisp で Scheme ライクにやりたいなら、方法は
1. Scheme コンパイラを書く
2. マクロでごまかす
CL-USER> (defmacro with-542-form (expr) (if (and (consp expr) (consp (car expr))) `(funcall ,@expr) expr))
WITH-542-FORM
CL-USER> (with-542-form ((if t #'+ #'-) 1 2))
3
CL-USER> (with-542-form ((if nil #'+ #'-) 1 2))
-1


547 :デフォルトの名無しさん:2007/01/20(土) 23:20:02
>>546
よくわかりました。
イメージとしてはSchemeのほうが文法の制限が多いと思ってたんですが
そんなことないんですね

548 :デフォルトの名無しさん:2007/01/20(土) 23:20:47
>>544
中置記法ってのは中置記法のリーダを用意するってこと?それとも構文木を中
置記法表現にしたいってこと? Lisp 処理系は↓のような構成になるので、
リーダが文字列から構文木をつくる -> 評価器 (インタプリタ or コンパイラ) が処理
数式とかが扱いたい場合は、それ用のリーダを書いて内部的には前置記法で処理するのが定石。
MAXIMA とかが例だね。


549 :デフォルトの名無しさん:2007/01/20(土) 23:43:00
>>548
定石通り中置記法で書いてそれを前置記法に変換するリーダを用意しようと
考えてます。
あと括弧もなるべく減らせる構文にしたいなあと思ってます。
それで前置記法でしか表現できない概念があるからLispは前置記法を採用してる
のかな?と思って質問しました。

550 :デフォルトの名無しさん: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 マクロは冗長に書いてほしかった。
いや面倒だったんだろうけどさ。

551 :デフォルトの名無しさん:2007/01/21(日) 00:22:06
>>550
はい、今はまだ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
という本を見つけたんですが、誰か読んだことのある人はいないでしょうか?
書評をみるとべた褒めなので気になっています。

552 :デフォルトの名無しさん:2007/01/21(日) 00:43:47
学生時代 Scheme 派だったんで読んだことあるよ。Scheme 作る本。一から解説されているが、
まず Scheme か Lisp を知ってる必要がある。
一応ここは Common Lisp 入門スレなので本スレのほうが喰いつきがいいと思うけど。

553 :523:2007/01/21(日) 00:54:26
今日はとても参考になった。d

554 :デフォルトの名無しさん:2007/01/21(日) 16:27:48
abclがうごかない
mustangでサンプル動かそうとしたが起動時にこける

555 :デフォルトの名無しさん:2007/01/21(日) 17:35:49
kawaを使え

556 :デフォルトの名無しさん:2007/01/22(月) 02:56:40
>>554
うーむ。もうちょっと情報をください。
clisp 2.41 + jdk-1.6.0 で abcl-0.0.0.9 ビルドしてみたけどちゃんと起動したよ。


557 :デフォルトの名無しさん:2007/01/22(月) 06:04:20
>>556
eclipseでソースとりこんでそのまま動かしてる。
jarにしないとダメ・・・なわけはないとおもうけどなぁ。。。??

558 :デフォルトの名無しさん:2007/01/22(月) 06:29:26
ごめん、jarに固めたら動いた・・・

559 :デフォルトの名無しさん:2007/01/23(火) 11:32:57
quoteの意味で質問なんですが

(defun hoge () (+ 1 2))
と定義して
(list (hoge))と呼び出した場合、まず(hoge)が評価されて
(list 3)になり、それから3がlistに渡されて(3)というリストが返されるという
順番で処理されていくと考えているんですが、それなら
(defun hoge2 () 'a)と定義した場合
(list (hoge2))を呼び出すと
(list a)となってエラーになるはずなのに、ならないのは何故なんでしょうか?


560 :デフォルトの名無しさん:2007/01/23(火) 11:46:59
>(list a)となってエラーになるはずなのに、ならないのは何故なんでしょうか?
これは「a が変数として処理されて、エラーになっちゃうはず」という意味で解釈して返事すると……

実際は (list 'a) となる。
'a は変数として扱われないのでエラーにならない。
'a はシンボル型というもの。シンボル型っつうのは文字列の親戚みたいなもん。
(こんな説明したら他の人から怒られるか)

561 :デフォルトの名無しさん:2007/01/23(火) 12:06:15
>>560
うーん、まだいまいち理解できません・・・
>実際には(list 'a)となる。
'aを評価するとaになって、↓のような順番に計算されていると思うんですが
'aを評価する -> aになり、それが返される -> aがlistに渡される(list a)

関数の最後の式を評価した値が、その関数の返り値となり、
そして'aを評価するとaになるのに、listには'aの値が評価されないままに
渡されてるのが理解できません。
こんな入り口で躓いてしまってるのが悲しいorz

562 :デフォルトの名無しさん:2007/01/23(火) 12:14:55
>>559
> (list 3)になり、

そういう考え方をするなら、厳密には (list '3) と考えるべきだね。
たまたま '3 => 3 だから結果は同じになるだけ。

おおざっぱな規則としては、

(1)数値・文字列・配列などは評価するとそれ自身になる。
(2)シンボルは評価するとそのシンボルに束縛された値になる。
(3)リストの場合は、
(3a)先頭のシンボルが関数なら、その関数を呼び出す。
そのときリストの先頭以外をひとつずつ評価して、関数の引数として渡す。
(3b)先頭のシンボルがマクロなら、そのマクロを展開してその結果を再評価する。
(3c)先頭のシンボルが特殊形式ならそれなりのことをやる。w

ってなところかな。このくらい覚えておけば生きていけるよ。

563 :デフォルトの名無しさん:2007/01/23(火) 12:23:00
>>562
つまり関数の最後の式そのものが、外側の関数の引数になると考えれば
いいんですね。まだちょっとモヤモヤしてるけど、理解できました。
ありがとうございます。

564 :デフォルトの名無しさん:2007/01/23(火) 15:31:26
CLOSについて質問なんですが
hogeというメソッドがあったとして、このhogeは
同じ数の引数しか取ることができないのは何故なんでしょうか?

565 :デフォルトの名無しさん:2007/01/23(火) 16:51:55
そういう決まりだから

566 :デフォルトの名無しさん:2007/01/23(火) 17:02:26
どちらかというと、いわゆる overloading よりも、ポリモーフィズムを意図して設計されている
んじゃないかな。論理的に同じ意味を持った(だから使い方は同じ)関数を渡されたオブジェクト
によって違う実装に導くのが主眼。
メソッドがクラスに隷属するスタイルの(現代の一般的な)オブジェクト指向言語とは元々の
考え方が違う。
あと、CLOS無しのCommon Lisp上のライブラリとして(CLtL1の核を変更しないで)実装できる
ようにという歴史的な意図も多少あるかもしれない。

567 :デフォルトの名無しさん:2007/01/23(火) 22:00:48
>>566
C++なんかのOOPが主語を軸においてるとすれば
CLOSは動詞に軸を置いているって感じなんですかね

もし正方形と三角形の面積を求める1引数のメソッドareaに
後になって立方体の面積を求める2引数のメソッドareaを追加したかったら
やっぱり既存のメソッドの定義を変更して、呼び出している全ての部分に
ダミーの引数を渡すしかないんでしょうか?

568 :デフォルトの名無しさん:2007/01/23(火) 22:03:01
>>567
&optionalにすれば良いのでは?
定義は変えなきゃならんが、呼び出してるほうはそのままで済むと思う。

569 :デフォルトの名無しさん:2007/01/23(火) 22:14:16
>>568

(defmethod area ((x cube) &optional y))
こんな感じにすれば良いんですね。
うーん でもできれば異なる数の引数でもメソッドが定義できる
ようになって欲しいな・・・



570 :デフォルトの名無しさん:2007/01/23(火) 22:39:56
機能が明白に違うのだから違う名前を付けるべきだと思う

571 :デフォルトの名無しさん:2007/01/23(火) 22:55:20
立方体の面積って、表面積のこと?
引数の数が変わる理由がいまいちわからんけど、自分だったら area-of-plane と
area-of-solid って感じで別名にするかな。

メソッドは動的ディスパッチのために(つまりポリモーフィズムのために)効率が良くなるように
設計されている気がする。引数も違うってことは静的にディスパッチが前提だし、メソッド名も
変えたほうが可読性の点でも望ましいと思う。

572 :デフォルトの名無しさん:2007/01/23(火) 22:59:19
動詞に軸を置いてるって以上に、同じ名前空間だから。

C++やJavaだとクラスが名前空間を兼ねているんで、
同じ名前がついていても全然別のもの。
STLでbegin、end等が共通してるのはユーザがそういう約束で注意して書いているだけ。

CLOSはそうじゃない。違うものには違う名前。

ここの「同じ」「違う」って概念がまたC++/Javaだと超適当だけど
CLOSでは同じ外部仕様(引数の数とか)で働くもの、と厳密というか
より計算機上の概念として考える。

573 :デフォルトの名無しさん:2007/01/23(火) 23:03:30
CLOS のメソッド名って特定のパッケージに属するんだっけ?




574 :デフォルトの名無しさん:2007/01/23(火) 23:04:30
>>573
シンボルだから当然そう

575 :デフォルトの名無しさん:2007/01/24(水) 01:29:19
たぶん CLOS 的なやり方に頭を切り替える必要がある。
(triangle:area x) と (cubic:area x y) とかするか、
型を定義してディスパッチしる。個数でディスパッチなんてだめぽ。
長方形の面積と立方体の面積の区別がつかないじゃん。
(defmethod area ((target <triangle>)) ...)
(defmethod area ((target <cubic>)) ...)
CLOS のメソッドは「引数の個数」よりも引数の型の組み合わせによるメソッドの特定。


576 :デフォルトの名無しさん:2007/01/26(金) 22:33:04
>>558
Javaでlispが使えるとして何に使うんだ?
用途が思いつかないな。

577 :デフォルトの名無しさん:2007/01/26(金) 22:34:24
思いつかない人は使わなければいいと思うよ

578 :デフォルトの名無しさん:2007/01/27(土) 01:33:46
回答できないくせに自意識だけは強くて
ついうっかりどうでもいい私見をなすりつけちゃいました

579 :デフォルトの名無しさん:2007/01/27(土) 02:35:16
Java で書いた自作アプリに拡張性を持たせるために
何かしらのスクリプト言語(たとえばLisp)をつけとくとか?
Emacs の elisp みたいなかんじ。

で、guile も tcl のリプレースとして、という話じゃなかったっけ。
最近どうなってるのかしらんが。

580 :デフォルトの名無しさん:2007/01/28(日) 04:48:39
>>576
それ言い出すと、javascriptもrubyもpythonもhaskellもJavaで動くから
どうなのよ、という状態なんだが。これから何か出てくるんじゃないか?

581 :デフォルトの名無しさん:2007/01/28(日) 05:52:14
現状だと Java の豊富なライブラリが Lisp から直接つかえる。
これはFFI 経由よりもお手軽なんで利点と嬉しいんじゃない。

あとは、いわゆる LL と違って CL は compile が規格に入ってるからね。
optimize の指定で JIT とか制御できるようなるとか夢は広がる。

582 :デフォルトの名無しさん:2007/01/28(日) 14:50:58
defvarとdefparameterはどういう風に使い分けるものなんでしょうか?
もう一度値をセットできるかどうかというのがどういった意味を持っているのかが
よくわかりません

583 :デフォルトの名無しさん:2007/01/28(日) 15:01:49
defparameterは定数だからコンパイラがコンパイル時の値で最適化していいんじゃないかな

584 :デフォルトの名無しさん:2007/01/28(日) 15:35:31
>>583
空目しとるな。defconstant 定数定義。defvar と defparameter の違いだろ。

defvar と defparameter はダイナミック変数を定義する。
しかし、定義した変数の初期値の設定の仕方が異なる。 defparameter は評価するたびに
値を設定する。defvar は対象の変数名が「束縛されていない」場合のみ値を設定する。
ファイルをリロードしたときなんかに違いがでる。

CL-USER> (defvar x 10)
X
CL-USER> (setq x 1)
1
CL-USER> (defvar x 10)
X
CL-USER> x
1
CL-USER> (defparameter y 10)
Y
CL-USER> (setq y 1)
1
CL-USER> (defparameter y 10)
Y
CL-USER> y
10


585 :585:2007/01/28(日) 15:42:36
あぁ、使い分けの意味か。すまん。そのコードをリロードしたときにもう一度初期化
してほしい場合は defparameter 。稼働中で値を変更されたりすると困るようなのは
defvar を使う。

いわゆる LL みたいに プログラム起動 → 終了 みたいな使い方だと defparamter
のほうが直感的だったりするのかな?使い方によるけど状態をイメージに保存して使いつづける
やり方だとプログラム修正しただけで状態まで初期化されると不便なんで defvar を使う。

586 :582:2007/01/28(日) 16:46:42
なんとなく違いがイメージできました。ありがとうございます

587 :デフォルトの名無しさん:2007/01/29(月) 16:57:01
#'がある理由って一体何なんでしょうか?
最初は1つのシンボルが関数と値の二つを同時に持てたなら
x -> xの値を返す
'x -> シンボルxを返す
#'x -> xの指している関数を返す
という風に使い分けをするためなのかと思ったんですが
(setf x 10)
x -> 10
(setf x #'+)
x -> 関数オブジェクト
#'x -> エラー
となって1つのシンボルが同時に関数と値を持てないことがわかりました。
それなら何故applyのような関数を要求する関数には#'を付けた変数を渡すといった
ルールをわざわざ作ったんでしょうか?

588 :デフォルトの名無しさん:2007/01/29(月) 17:07:50
>>587
おそらくシンボルとそれに入っているオブジェクトを混同している。
ひとつのシンボルには「関数値」と「値」という2つのオブジェクトを入れる箱が付いている。
(setf x #'+) は関数オブジェクトを「値」のほうに入れてしまう。
「関数値」のほうの箱に入れたいならば、
(setf (symbol-function 'x) #'+)
とやらなければならない。
シンボルに #' を付けるとそのシンボルの「関数値」に入っているオブジェクトが取り出される。
applyのような関数にはそういうものを渡さなければならない。

589 :デフォルトの名無しさん:2007/01/29(月) 17:19:38
>>588
とてもよく理解できました。わかりやすい説明ありがとうございます。
もう1つ質問なんですが
lambda式はそれ自体が関数名としてみることができるとどこかで読んだんですが
+ -> +
#'+ -> 関数オブジェクト
という風に+をそのまま評価したときは+がそのまま返るのに
(lambda () (+ 1 2)) -> 関数オブジェクト
#'(lambda () (+ 1 2)) -> 関数オブジェクト
という風に#'を付けても付けなくても関数オブジェクトが返るのは何故なんでしょうか?
上で言っているようにlambda式=関数名なら
(lambda () (+ 1 2)) -> (lambda () (+ 1 2))
という風になると思うんですが・・・


590 :デフォルトの名無しさん:2007/01/29(月) 17:26:26
>>589
> (lambda () (+ 1 2)) -> 関数オブジェクト
> #'(lambda () (+ 1 2)) -> 関数オブジェクト
> という風に#'を付けても付けなくても関数オブジェクトが返るのは何故なんでしょうか?

前者は元々のCommon Lisp (CLtL1/2)ではエラーだった。現在の規格(ANSI)では
lambdaというマクロが定義されていて、後者と同じ意味になるようになっている。
おそらく #' を書くのが面倒くさいと主張する輩がいたのだろう。w

591 :デフォルトの名無しさん:2007/01/29(月) 17:28:36
>>589
> lambda式はそれ自体が関数名としてみることができるとどこかで読んだんですが

どこで読んだか知らないけど、それは厳密には正確な理解ではないと思う。
おそらく概念的な説明だったのでは?

592 :デフォルトの名無しさん:2007/01/29(月) 17:36:06
>>590
同名のマクロだったんですね。よくわかりました。ありがとうございますw
>>591
探してみたらPaul GrahamのANSI Common Lisp 23pでした
>ラムダ式は全体として関数名と見なせる。

593 :デフォルトの名無しさん:2007/01/29(月) 18:38:28
それはフォームの先頭にラムダ式を書けるということじゃないの?

594 :デフォルトの名無しさん:2007/01/29(月) 22:17:51
>>589
> + -> +
これって + がそのまま返ってるというより、直前に読み込んだ式が返ってるんでは?

595 :デフォルトの名無しさん:2007/01/29(月) 23:42:38
Lispはあと30年は戦えますか?

596 :デフォルトの名無しさん:2007/01/29(月) 23:52:54
まぁ30年後のLisperも、自分で言わなきゃ誰も言ってくれない哀しい優位性を
寝言のようにどこかでぶちまけてるんだろうなとは思う。

597 :デフォルトの名無しさん:2007/01/31(水) 23:31:16
Common LispでSchemeのdefineやCの#defineのような
単純なマクロを使うにはどうすればいいんでしょうか?

598 :デフォルトの名無しさん:2007/02/01(木) 00:06:06
単純なマクロとは?

599 :デフォルトの名無しさん:2007/02/01(木) 00:15:49
>>598

#define HOGE foo-bar-baz
のような単純にテキスト置換をしてくれるような機能です

600 :デフォルトの名無しさん:2007/02/01(木) 00:33:36
あまり使われない機能だけどシンボルマクロってのがある。
(define-symbol-macro HOGE foo-bar-baz)
みたいな感じ

601 :デフォルトの名無しさん:2007/02/01(木) 17:59:45
>>600
ANSIになって追加された機能みたいですね(CLtLには載ってませんでした)
ありがとうございます

602 :デフォルトの名無しさん:2007/02/01(木) 18:04:34
setfについての疑問なんですが
(setf 10 nil)
とやるとエラーになるのに
(defun hoge (x)
(setf x nil))

(setq a 10)
とやって
(hoge a)とやってもエラーにならないのは何故なんでしょうか?
xが10になるのでエラーになるはずだと思うんですが・・・

603 :デフォルトの名無しさん:2007/02/01(木) 18:16:39
setfはマクロ(特殊形式かも)なので、第一引数は評価されない。
第一引数の場所に数値を書けば必ずエラーになるし、シンボルを書けば
setqと同じ意味になる。

604 :デフォルトの名無しさん:2007/02/01(木) 22:08:17
>>603
関数じゃなくてマクロなんですね
わかりました。ありがとうございます

605 :デフォルトの名無しさん:2007/02/02(金) 02:22:27
gethashの引数はキー、テーブルの順なのに
getの引数はシンボル、キーの順番なのは何か理由があるんでしょうか?

606 :デフォルトの名無しさん:2007/02/02(金) 02:45:01
おそらく歴史的な理由

607 :デフォルトの名無しさん:2007/02/02(金) 03:21:19
この手の引数の順序は大抵英語の目的語の順番であることが多い

608 :デフォルトの名無しさん:2007/02/04(日) 13:35:44
Lispの処理系を勉強したいと思って
CLispのWindows版をダウンロードしてみたんですが
srcフォルダを見てもmain関数を探す以前にCのソースファイルすら見つかりませんorz
このようなオープンソースのプログラムのソースを勉強する場合、
どういった方法でプログラムを読んでいけばいいのでしょうか?

609 :デフォルトの名無しさん:2007/02/04(日) 15:00:54
お、やる気の人がきたね。CLISP の Windows 版についてるのは LISP ソース
の一部だけだった記憶があるからソースの配布物 (tar.gz) を入手するか CVS
から取得する必要があるよ。ソースの構成は CLISP の IMPLEMENTATION NOTE
に書いてある。


610 :デフォルトの名無しさん:2007/02/04(日) 16:43:35
>>609
ありがとうございます。(´;ω;`)
早速ダウンロードしてなんとか_clisp.cにmain関数を見つけることができたのですが
今まで教科書に載ってあるようなCのコードしか読んでこなかったので
defineやifdefがありまくりのコードはどうやって読んでいけばいいのか
検討もつきませんorz
「現実」のソースを読むためのコツやツールの使い方(今はテキストエディタでファイルを1つ
1つ見ているんですが、多分もっと楽に複数のソースを読むためのツールがあるはず・・・)
Webサイトか書籍はないでしょうか?



611 :デフォルトの名無しさん:2007/02/04(日) 17:19:28
_clisp.c は Win32 用のドライバプログラム (clisp.exe) のソースだよ。
Implementation Notes の 33 章がソース構成の解説。CLISP のソースは
ちょっと独特で .d というコメント付きのソースを comment コマンド
(util/comment5.c) で .c に変換してる。

コア部分は src/eval.d がインタプリタ/バイトコードインタプリタで
コンパイラは lisp で書かれた compiler.lisp が本体。CLISP はコメントや
ドキュメントは結構充実してるけど日本語の情報は少ないんで、いきなりチャレンジ
するのは敷居が高いかもねぇ。C や LISP はどのくらいの経験なの?


612 :デフォルトの名無しさん:2007/02/04(日) 17:42:38
>>611
プログラムの勉強を始めて2年ほどなんですが
Cの経験はC++でテトリスもどきを作ったことがあるぐらいです
本に載ってるようなアルゴリズムは理解できるんですが、それと現実のソース読むのは
全然別問題ということを痛感してますorz
Lispは半年ほど前にPaul Grahamのエッセイを読んで興味を持ったんですが
SICPや竹内先生の本のevalの実装を見て、実際の処理系はどうやって実装されてるのか
理解したくなったので、いままで勉強のために使っていたCLispのソースを呼んでみようと思いました。

613 :デフォルトの名無しさん:2007/02/04(日) 19:07:19
>>612
ttp://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の実用的アプリを読む訓練と,インタプリタもしくはコンパイラを理解する訓練は
別々にやった方がいいからねぇ...

614 :デフォルトの名無しさん:2007/02/04(日) 19:58:27
>>613
このソースなら自分にもなんとか読めそうです。ありがとうございました。
あと、話は変わるんですがオープンソースを読んでいくならUnix系のOSを
使っていくようにしたほうがいいんでしょうか?
うまく言えないんですがUnixを使っていれば自然に身に付くような知識が
暗黙の了解としてオープンソースを読むときに必要になるんじゃないのかなと
少し思ったので・・・

615 :デフォルトの名無しさん:2007/02/04(日) 20:11:04
>>614
多少そういう面はある。金掛かる訳じゃないし、とりあえず使ってみるといいよ。
どちらを使ったほうがいい、というのではなく、どちらも知っていることが有益。

616 :デフォルトの名無しさん:2007/02/06(火) 21:17:41
Windows用にビルドされたclispの4.1で、
ディレクトリのファイル一覧を取得して操作したいのですが、
その中に日本語名のファイルが存在した場合
syntax error... (つД`)・゚・

エンコード系の設定が不足しているのか、もともとclispで
日本語名のディレクトリ&ファイルを操作することが出来ないんでしょうか?

617 :デフォルトの名無しさん:2007/02/10(土) 11:04:22
CLOS で、あるクラスの派生クラスであるかどうかの
判定方法はどのようにするのですか?
今は作った派生クラス皆に対して

618 :すんません、書き直し。:2007/02/10(土) 11:05:15
CLOS で、あるクラスの派生クラスであるかどうかの
判定方法はどのようにするのですか?
今は作った派生クラス皆に対していちいち type-of で比較判定をしています。

619 :デフォルトの名無しさん:2007/02/10(土) 11:19:27
>>618
typep 使えばちゃんと継承関係を遡るけど。。
何かCLOSの使い方間違ってないか?どんなクラス作ってんだ?

620 :デフォルトの名無しさん:2007/02/11(日) 09:20:06
>>619 その typep を知りたかったんです。助かりました。

621 :デフォルトの名無しさん:2007/02/12(月) 01:45:03
>>616
UNIX だけど、 CLISP で普通に日本語ファイル名つかえてるなー。
よろずやさんとこによると Windows 版固有の問題ぽいね。
system::*pathname-encoding* を設定しても二バイト目が\ の文字を含むと駄目ぽい。

ネタ元 CLISP for Win32 の制限 (http://lispuser.net/commonlisp/clisp.html#id5)

>>620
defmethod でディスパッチするんじゃなくて typep 使って判定?
あんまそーゆうケースに出会わないんだけどなぁ。

622 :デフォルトの名無しさん:2007/02/12(月) 11:03:27
EUC は2バイト文字が \ を含まないからね。

623 :620:2007/02/13(火) 01:32:37
>>621
線形リストの中身に対し順に作業をするのに、
あるクラス A の派生クラスのインスタンスである場合にだけ
特別な事をする様な事をしてまして、そこでの判定時に使ってます。
おっしゃる通り、
そこでの作業について、クラス A のインスタンスか否かで
呼ばれる関数が変わる様にすれば良いのかもしれないんですが、、、


624 :デフォルトの名無しさん:2007/02/13(火) 09:34:48
少なくともそういうのをあからさまに書くのはOOの考え方には反してるね
実際に(設計が悪くて)必要な場面があるだろうことは否定しないけど

625 :デフォルトの名無しさん:2007/02/13(火) 13:22:15
確かに(CLOSでは)元のクラスをいじらずにメソッドを追加できるから、必要性は低いけれ
ども typep くらいは常識として知っておく必要はあるね。
いろんな手法を知った上で最適な解を選ぶべきで、一概に設計が悪いとも言えないだろう。

626 :624:2007/02/13(火) 21:36:25
>>625
>一概に設計が悪いとも言えないだろう
確かにその通り.あれは例えばのつもりだった

627 :デフォルトの名無しさん:2007/02/14(水) 13:05:22
Common Lispでは
(let ((x 20))
  (defun hoge ()
    x)))

(hoge)
とやるとxの値が返るのに
Schemeではエラーになるのは何故なんでしょうか?

628 :デフォルトの名無しさん:2007/02/14(水) 13:06:58
>>627
Schemeにはdefunが無いから

629 :デフォルトの名無しさん:2007/02/14(水) 13:08:51
>>628
すいません、説明不足でした。
Schemeだと
(let ((x 20))
  (define (hoge)
x)))
(hoge)
とやってもエラーになるのは何故か?
ということを聞きたかったんです

630 :デフォルトの名無しさん:2007/02/14(水) 13:12:44
>>629
Schemeのletの本体にはdefineとかじゃないものが最低ひとつは必要だから。
例えば
(let ((x 20)) (define (hoge) x) (hoge))
ならエラーにならない。

631 :デフォルトの名無しさん:2007/02/14(水) 13:17:23
>>630

(let ((x 20))
 (define (hoge)
  x)
 10))
こうやると10が返されるんですが、その後に
(hoge)
を呼び出すとやっぱりエラーになってしまいます。

632 :デフォルトの名無しさん:2007/02/14(水) 13:21:25
>>631
letの中のdefineはローカルスコープで定義するから、letの外側では無効になるのよん。
Common Lispとの違いという意味では有意義だけど、Schemeの話を続けるなら他のスレ
のほうが良いかもね。

633 :デフォルトの名無しさん:2007/02/14(水) 13:24:40
(let ((x 20)) (define (hoge) x) ) = (let ((x 20)) (letrec ((hoge (lambda () x))) ) ) だから。
詳細は r5rs の 5.2.2 を参照のこと。

634 :デフォルトの名無しさん:2007/02/14(水) 13:28:34
>>632
defun どこで呼ばれても大域環境に関数を作る
define その呼ばれたスコープ内に関数を作る。当然そのスコープ外ではその関数は使えない

こういう違いだと考えていいんでしょうか?
でもこれだと
(let ((count 0))
 (defun reset ()
  (setf count 0))
 (defun stamp ()
  (setf count (+ count 1))))
みたいなのをSchemeでやるのは難しそうですね

635 :デフォルトの名無しさん:2007/02/14(水) 13:33:39
>>634
Schemeで書くとこんな感じかn
(define reset '())
(define stamp '())
(let ((count 0))
(set! reset (lambda () (set! count 0)))
(set! stamp (lambda () (set! count (+ count 1)) count)))


636 :デフォルトの名無しさん:2007/02/14(水) 13:42:39
>>635
すごく参考になりました。ありがとうございます。
バレンタインデーの真昼間なのに質問してすぐに回答してくれるなんて(´;ω;`)

637 :デフォルトの名無しさん:2007/02/14(水) 19:26:27
>>636
どうでもいいけど、お礼なのか嫌味なのか微妙なレスだなwww


638 :デフォルトの名無しさん:2007/02/15(木) 00:13:12
文字列や文字からシンボルを作るにはどうやれば良いのでしょうか?

639 :デフォルトの名無しさん:2007/02/15(木) 00:19:22
intern

640 :デフォルトの名無しさん:2007/02/15(木) 00:24:19
>>638
うひゃー文字列としてリストも読み込めるみたいですね。凄い。
ありがとうございました。


641 :デフォルトの名無しさん:2007/02/16(金) 02:43:23
LispでのCGIに挑戦しようと思ったのですが
Windows環境でCLispを起動すると
WARNING: locale: no encoding CP932, using ISO-8859-1
WARNING: *TERMINAL-ENCODING*: no encoding CP932, using locale encoding
という警告が出てしまいます。
これを出ないようにするにはどうしたら良いのでしょうか?

642 :デフォルトの名無しさん:2007/02/16(金) 08:04:37
その CLISP は cp932 エンコーディングをもっていない。
libiconv がリンクされてないバイナリなんじゃないか?
あと、イメージにいろいろ取り込んでくと CGI は実用に
ならないだろうね。 FastCGI か mod_lisp を使う事になると思われ。

643 :デフォルトの名無しさん:2007/02/16(金) 12:57:12
>>642
2.37を使用していたんですが、最新版を試してみたら警告が出なくなりました。
>イメージにいろいろ取り込んでいく
これはどのような意味なんでしょうか?
あと今気が付いたんですがCommonLispで環境変数にアクセスするにはどうしたら良いのでしょうか?
調べてみるとGaucheならget-envで取得できるみたいなんですが
CLtLやClispのドキュメントを見てもそれらしい関数が見当たりませんorz


644 :デフォルトの名無しさん:2007/02/16(金) 20:15:35
>>643
無理。Clispではできない。

645 :デフォルトの名無しさん:2007/02/16(金) 21:47:01
>>644
そうなんですかorz
わかりました。ありがとうございます。



646 :デフォルトの名無しさん:2007/02/17(土) 00:20:04
(while t
 (dolist (c '(33478 33449 33471 33474 33453 33471 33476 10))
    (princ (code-char c))
    (sit-for 0.03)))

647 :642:2007/02/17(土) 15:27:41
CLISP でも ext:getenv で取得できるよ。
glibc モジュールがあるなら linux:getenv も使える。
CLISP Implementation Notes の 31.8 を参照のこと。


648 :デフォルトの名無しさん:2007/02/17(土) 21:32:16
lispと多言語のインターフェイスってどんなのがあるのでしょうか?
http://mail.python.org/pipermail/python-list/2007-January/423984.html
pythonはみつけました
rubyもあるのでしょうか?

c, c++へのインターフェイスは、あるとどこかで読んだのですが
みつけられませんでした

649 :デフォルトの名無しさん:2007/02/18(日) 00:30:53
その程度自分で作れないでどうする

650 :デフォルトの名無しさん:2007/02/18(日) 01:13:11
>>648
foreign function interface のこと?
それか SWIG で探すと何かみつかるかも

651 :デフォルトの名無しさん:2007/02/18(日) 04:12:29
>>648
それは LISP と Python とのインターフェースとは言わないような。
Python で書かれた Lisp もどきだろう。素直に Python 使うほうがいいと思う。
Ruby で書かれた Lisp もどきも沢山あるよ。でもスクリプト言語で実装された系の
もので、残念ながら遅い、不完全、作者モチベーション低いなど実用になるものはほとんどない。

C へのインターフェースというのは、 Foreign Function Interface (FFI) と呼ばれる
共有ライブラリや DLL を使う機能。処理系毎にこの機能をもっているが、フリーの実装
だと最近は CFFI という共通化された API を使うのは主流。AllegroCL なんかは SWIG
に対応して C/C++ のモジュールが使えるね。

652 :デフォルトの名無しさん: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したのと同じことになるんでしょうか?


653 :デフォルトの名無しさん:2007/02/21(水) 07:59:17
まぁ、なんとなく言いたい事はわかる。
だいたいそれでオブジェクト指向でいうオブジェクトと似たようなもんだ。
実際はクラスベースの OO だとクラスとオブジェクトそのものを分離するとか
継承とかの実装とか、いろいろ細かい点あるけど(メソッドは「クラス」に
属するもので「オブジェクト」に属すとプロトタイプベースぽくなっちゃう)。

654 :デフォルトの名無しさん:2007/02/24(土) 11:38:10
無名関数があるということは無名マクロもあるのだろうか?

655 :デフォルトの名無しさん:2007/02/24(土) 11:54:20
>>654
無名マクロってどう使うんだろ。
macrolet があれば十分な気がする。

656 :デフォルトの名無しさん:2007/02/24(土) 14:25:33
存在しても意味はない。マクロとは、プログラムの構造やパターンに名前を
付けたもの。たとえば、 when マクロを無名として使うと
(when (condition)
body ...)

((mcaro (cond &body body) `(if ,cond (progn ,@body))) (conditon)
body ...)
となる。嬉しくもなんともない。if や when のような構文は高階関数のように
組み合わせるってこともないからね。だが、それでも君がどうしても無名マクロを
実現したいなら、君の自作インタプリタの評価器で lambda フォーム
のように macro フォームを無名マクロとして評価すれば実現はできる。


657 :デフォルトの名無しさん:2007/02/25(日) 09:26:43
すげーわかりやすい解説ありがとう。
>マクロとは、プログラムの構造やパターンに名前を
付けたもの
これが今まで読んだ本の説明より一番分かりやすかった。

658 :デフォルトの名無しさん:2007/02/25(日) 11:16:36
* (defun test2 ()
(read)
(format t "test> ")
)

TEST2
* (defun test3 ()
(format t "test> ")
(read)
)

TEST3
*

どっちも同じ挙動になるんだけど(sbcl) 同じ事にぶち当たって解決した人は
いません?

659 :デフォルトの名無しさん:2007/02/25(日) 11:32:27
バッファリングの問題だね。効率の問題で入出力は内部でバッファリングされる
バッファリングモードが標準で使われる。 C とかでも同じだが、通常これは改行
されるまで内部バッファはフラッシュされないため、画面に表示されない。
なんで、Common Lisp の finish-output オペレータを使って手動でバッファ内容
を出力してやれば望みの結果が得られるよ。

(defun test ()
(format t "test> ")
(finish-output t)
(read))


660 :デフォルトの名無しさん:2007/02/25(日) 11:43:44
>>660
速いレスありがとう。
バッファリングの問題なのか。
早速試したけど、うまくいかなかったです。

661 :デフォルトの名無しさん:2007/02/25(日) 12:02:06
finish-output の引数が t だから。
省略するか *standard-output* を指定すれば期待どおり動く。

format の最初の引数が t の場合、出力先は *standard-output* になるが
finish-output の最初の引数が t の場合、対象が *terminal-io* になる。

662 :659:2007/02/25(日) 12:09:22
すまん… >>661 の言うとおり finish-output の引数が違う。
詳しく言うと、以下の通り。
format の第一引数は nil, t, ストリーム、文字列のいずれか。
nil なら結果が文字列としてかえる。t なら標準出力 *standard-output* になる。
finish-output の引数はストリームで省略時は *standard-output* ね。


663 :デフォルトの名無しさん:2007/02/25(日) 12:14:05
じゃあ (format *terminal-io* "test> ") -> (finish-output t) でもいいのか…
うーむわかりにくい

664 :デフォルトの名無しさん:2007/02/25(日) 12:34:13
ありがとう!
おかげさまでうまく動きました。

665 :デフォルトの名無しさん:2007/02/25(日) 13:04:06
>>648
http://trac.common-lisp.net/clpython/
というのもあるみたい。swigはclispにも対応しているみたいですね。

666 :デフォルトの名無しさん:2007/02/25(日) 22:59:12
教えてもらったお礼にあれからいろいろ試した事を書きますね。
>>658 のことですが、 emacs+slime上の sbcl では何の問題もないようです。
また、openmclも問題は起きなかったです。起きるのは、terminal上で使うと
きのsbclだけおきてたようです。(openmcl sbclだけしか使ってないけど。)
その対処方法まで教えてくださって重ね重ねありがとうです。

667 :デフォルトの名無しさん:2007/02/26(月) 18:21:00
総称関数とオーバーロードが意味的に異なってるのは、どういう点においてなんでしょうか?

668 :デフォルトの名無しさん:2007/02/26(月) 19:54:51
総称関数の機能はオーバーロードの機能を包含するというのが私の理解

どう包含するかってのは,ANSI Common Lispでも読んで

669 :デフォルトの名無しさん:2007/02/27(火) 00:36:32
>>668
済みません、端的に教えてもらえると助かります。
オーバーロードに無くて総称関数にある機能ってなんですか?

670 :デフォルトの名無しさん:2007/02/27(火) 00:40:19
個人的には総称関数はoverloadよりもoverrideを想定している気がする。
overloadとして考えると引数の数の違いなど機能的に不十分とも思える。

671 :デフォルトの名無しさん:2007/02/27(火) 02:20:49
二択で言えばオーバーロードは含んでいないというのが私の理解だったりするが(キーワード引数を除く)。

>>668が言いたいのは第一引数以外の引数もメソッド特定に関与するということだと思う。

あえて機能的に比較してみれば、ってことで、理解していない人が理解しようと
してオーバーロードを持ち込んだ話をするのは間違いの元だから止めた方がいいよ。

672 :デフォルトの名無しさん:2007/02/27(火) 03:01:26
>>668
総称関数はオーバーロードを含んでないっつーか種類が異なるものでしょ。
>>669
オーバーロード
関数のシグネチャ(引数とか返り値の型のことね)によって動作を変えるだけ

総称関数
よくあるOOPだとメッセージを送る対象は左に置くでしょ。
でもCLOSでは引数みたいに右側に置くことで、メッセージを送るオブジェクトが1つでも
それ以上でも一貫したルールで抽象化できる

っていう風に認識してる。
まあ複数のオブジェクトに同時にメッセージを送るのはOOP的にどうなんだろうって感じもするけどね
あとわかりやすい違いといえば>>670も言ってるように、どの処理をするのかが、
オーバーロードではコンパイル時に対して総称関数は実行時っていうことだね。

>>671
未知の物を理解しようとするとき、(少なくとも表面上は)似た物を比較することで理解しようとしていくのは
基本でしょ。それを禁止されたらなにもできないべ。

673 :668:2007/02/27(火) 05:39:20
オーケー,回答が投げやり過ぎて嘘になっててしまったみたい
これでどうよ

まとめると,「共に,単一の名前に複数の関数を関連付ける」という点では共通しているが...

>>672が言ってるのは:
オーバーロードは静的に(オペランドを与える式の型に従って)解決される
総称関数は動的に(実際にオペランドとなったオブジェクトの型に従って)解決される
>>670曰く,この点で総称関数はJavaでオーバーライドされたメソッドの解決と似ている)

>>670が言ってるのは:
オーバーロードでは引数リストが違うものを同じ名前に関連付けてよい
総称関数では関連付けられる関数(メソッド)たちの引数リストは共通してなければならない

おまけ
CLOSの総称関数では型のみならず個々のインスタンスについても動作を変えられる(EQLスペシャライザ)
(例えば「第1引数がnumberだったら」に限らず「第1引数が 0 だったら」みたいな)

まぁこうやって羅列されたの読んでもいいプログラム書けるようにはならないわけですが...

674 :デフォルトの名無しさん:2007/02/27(火) 11:11:06
>>673
包含してないじゃん!

675 :デフォルトの名無しさん:2007/02/27(火) 11:17:28
> それを禁止されたらなにもできないべ。
んなこたーない

676 :デフォルトの名無しさん:2007/02/27(火) 12:26:28
>>672
似たものを比較することで理解しようというなら、まず君の「オーバロード」の定義を提示しなさい。
せめて「○○言語におけるオーバロードと比較して」とか書いてくれないとお話にならない。

677 :デフォルトの名無しさん:2007/02/28(水) 02:54:03
>>667 まだ、だれも言ってないみたいなので書いておくが、CLOS は C++/Java とは
設計思想から変える必要がある。引数の数によるオーバーロードはあんまり使わない。
個数を変更するような場合(省略可能値とか)オプショナル引数やキーワード引数を
使うとかはあるが、基本的に CLOS の総称関数はそのシステムのインターフェースだ。
そのインターフェースにオブジェクトを当てはめる事でメソッドを特定する。

俺も元々 C++ から来たんで最初戸惑ったけど、総称関数はもっと厳密なインターフェイスなんだよ。
クラスにメソッドが属するシステムだと、結局同じ名前だけどクラス毎に意味が
まったく違うって事があるけど、CLOS では名前の重みがもっと強い。
うーむ、ねむいのでうまく説明できんな。もうちょっと説明考えてみる…。

678 :デフォルトの名無しさん:2007/02/28(水) 12:42:09
つーか、なんで「引数の数を変えられない出来損ないのオーバーロードです」って
言いきっておしまいにする勇気を持てない? 動的なことが特徴…とかならともかく、
包含するとか、定義を明確にしろとか、名前の重みとか、端で見ていてハズカシイよ。

679 :デフォルトの名無しさん:2007/02/28(水) 12:49:24
>>678
そう言い切っても構わないけど、それで得られるものは少ない。
ここはCommon Lispのスレだし、現状の総称関数の使いこなしを考えるほうが
有意義ではないか?

別の言語を作りましょうという話なら、俺言語作成スレでも立てて勝手にやってくれ。

680 :デフォルトの名無しさん:2007/02/28(水) 14:55:27
>>678
いくら2chでも、その話の進め方は気持ちが悪すぎるよ。
自分の思う通りの結論を相手が出してくれない苛立ちを、勇気にすり替えて相手の人格の問題にすんなって。
あと「端」ってのも痛い。そういうのは自分一人の名義で言ってよ。端の一人である俺にはお前の方がハズカシイし。

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

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

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