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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
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
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
ガベジコレクタ様がよきに計らって下さるので、下々の者は気にしない、気にしない。
1917:2006/02/17(金) 01:30:53
たしかにメモリが足りなくなることはないのですが、
プログラムがやたら遅くなるので、やっぱなんとかならないかなと
思ってます。

ついでですが、>>17のfoo1は loop 〜 across 〜 summing を使った方
が見やすかったかもですね。
(個人的には loop は意味不明なのでなるたけ避けてる)
20デフォルトの名無しさん:2006/02/17(金) 01:48:21
array, sum あたりを declare するとマシになったりしない?
2117: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 は使った事無いけど...
2423:2006/02/17(金) 03:14:28
あ、出遅れた。ちなみに SBCL では fixnum 超えると integer でもメモリ使用量増えました。
optimize space とかも試してみたけど、ダメだった。
2517: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に突っ込むときヒープにアロケートされてるとか。
2723: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
2823: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 してみよう。
3317: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
ではうまくいきませんでした。

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

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

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

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

3630: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 を使う方が脳内変換より確実です。本当にありがとうございます。
4210: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みたいなことは
出来なかったりするのか?
4644: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
5150: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 でもいいかも
6057: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 も使えてるよ.
6257: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 とかいけるんだけど.
6457: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.
6757: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とか入れれるよ
7977: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
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
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の意見をもっと詳しく聞きたい。
134131: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 という関数を呼び出してエラーになる。
147145: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) になる。
149145: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
160158: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をマクロとして定義している時点で正しくない
ということになる。(本の中のプログラムは正確な例ではなく概念的な説明なのだと思う)
162158: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より短くならないといけない)
164158: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 〜) の前の #' は省略できることになっている
169165: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 なのだ。
171165: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
179175: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は教科書書かせたら神だよね。
190185: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
どうぞ
205203: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
単純な例ならともかく実用を考えると
パッケージ関係でややこしいことになりかねないしね。
208205: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 とかだと
独立した実行ファイルを生成することもできるのではないでしょうか。
213210: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
いかれてるから
218217:2006/10/09(月) 14:01:08
もちろん良い意味でね。
219デフォルトの名無しさん:2006/10/09(月) 15:45:49
最近出た「入門Common Lisp」っていう本はどう?
220デフォルトの名無しさん:2006/10/09(月) 15:50:39
括弧のお化けだ
221212: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
方言がありすぎる、
何を始めたらいいのかわからん
225210: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
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) と定義されている
277flatline ◆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とか書いてあるんだけど、
ラベルの付け忘れみたいなもん?
282flatline ◆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
言語が古いと何か困ることがありますか?
287flatline ◆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
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 でも #' は全部につけてるよ。
348347:2006/11/26(日) 22:10:58
うぎゃぁ。かぶったうえに俺のほうがクドい… 346 に嫉妬!!
349345:2006/11/26(日) 22:18:39
>>346
へぇー。なるほど。ありがとうございます。
ところで CommonLisp では #' してない生の lambda 式の評価結果って何なのですか?
;; Elisp では (consp (lambda (x) x)) => t で、ありゃぁ…って思いますたが
350345: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という関数が無いぞ、みたいな。
353346:2006/11/27(月) 00:33:16
>>348
いえいえ。ISLISPとの関連は知らなかったので勉強になったよ。
もうちょっと流行るかと思ったんだけどな。>ISLISP
さすがに3つも標準(方言)は要らんということか。
354345:2006/11/27(月) 01:21:39
>>351
>>352
どうもです。
ああ、なるほど。バイトコンパイルすると、関数オブジェクトになるんですね。

この方面で最初に触ったのが Scheme だったので、
Common Lisp や Elisp の lambda が、いまいひとつしっくりきませんでした。
355347: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
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 よりは格段に脳味噌酷使レベルが低いから初チャレン
ジにはいいぞ。わからん事はがんがん聞いてくれ。たとえ途中で力尽きても、
なにもしないよりは遥かにマシだからな。
374363: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の場合、実装から見ても言語の定義から見てもちょっと事情が違う。
376363:2006/12/01(金) 19:55:58
>>375
(直訳)Common Lispの場合少し事情が異なる、実装と言語がどのように
定義されたかの両方の結果として

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

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

なんて言ってる俺も実は読んでる途中だったりする。
378363: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

ちなみに文字のケースというのは大文字・小文字の区別のこと。
380363:2006/12/01(金) 22:44:12
>>大文字・小文字の区別のこと

そんな単純なことだったんですねorz
ちなみに今は1ページ読むのに最低30分かかってるんですが
年内までに読み終わることができるんだろうか・・・
381363: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
383363: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) を
(内部的に)実行する仕様になっているのだろうね。
385363: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を呼んでいるようですし...。
399398: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は末尾再帰は必ずしも最適化されなかったような。
403398: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
末尾再帰で書いていないに一票
406398: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 はコンパイラのみなので、いきなりコンパイルしちゃって最適化されてる。
インタプリタ実装されてるよ。まだデフォルトじゃないけど設定でインタプリ
タも使えるようになるよ。
408398: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}>)
410363: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 そもそもを書く必要がないから)


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

clispもsbclもこうなっていたのか
> コンパイルされる時に最適化が効くようになってる。by 408
414398:2006/12/03(日) 21:39:09
あれ、by 407だった。
415407: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
キャプテンクランチ キター
432363: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
とかを後からねじこんだようなものかな?
436363: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
455453: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スレならではの回答だな。
463363: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もついてくるようなので落として遊んでみるか
467363: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
477363: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 デベロッパ就任おめでとうございます。
日本語が使えるようになって助かってまつ。
480363: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にメールすれば結構レスポンス良く返事くれるよ。
いますぐ回答できないから後でまた連絡するね、って返事がきたときは
大抵催促しないとその先の返事が戻って来ないけど。
483363: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というモノを調べない……
487363: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に言及してあるのがわかるだろ……。
いやはや、ゆとり教育おそるべし。
489363: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 だった
491363:2006/12/22(金) 20:15:04
>>490
うーん
http://www.gigamonkeys.com/book/lispbox/
をみると28章と29章でマルチスレッドのサポートが必要になると書いてあるんですよね
でも26章の時点でaserveが要求されていて、特にCLispに対しての記述がないという
ことは、少なくともロードするだけでエラーが出るのは何か問題があるんですよね。

日本仕様のWindowsを使ってるのが問題なのかなorz
492cream: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)
495cream:2006/12/29(金) 12:22:03
早速の回答、どうも有り難うございます。
おかげで問題が解消しました。
496cream: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")
499cream: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
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
517512: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
つうことで、もういいかな
538524: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))))))
539524: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 入門スレなので本スレのほうが喰いつきがいいと思うけど。
553523: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
585585:2007/01/28(日) 15:42:36
あぁ、使い分けの意味か。すまん。そのコードをリロードしたときにもう一度初期化
してほしい場合は defparameter 。稼働中で値を変更されたりすると困るようなのは
defvar を使う。

いわゆる LL みたいに プログラム起動 → 終了 みたいな使い方だと defparamter
のほうが直感的だったりするのかな?使い方によるけど状態をイメージに保存して使いつづける
やり方だとプログラム修正しただけで状態まで初期化されると不便なんで defvar を使う。
586582: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バイト文字が \ を含まないからね。
623620: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 くらいは常識として知っておく必要はあるね。
いろんな手法を知った上で最適な解を選ぶべきで、一概に設計が悪いとも言えないだろう。
626624: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)))
647642: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* になる。
662659: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
未知の物を理解しようとするとき、(少なくとも表面上は)似た物を比較することで理解しようとしていくのは
基本でしょ。それを禁止されたらなにもできないべ。
673668: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でも、その話の進め方は気持ちが悪すぎるよ。
自分の思う通りの結論を相手が出してくれない苛立ちを、勇気にすり替えて相手の人格の問題にすんなって。
あと「端」ってのも痛い。そういうのは自分一人の名義で言ってよ。端の一人である俺にはお前の方がハズカシイし。
681デフォルトの名無しさん:2007/03/01(木) 07:50:29
あーあ、本スレもひどいことになってるし。こっちも人間初心者がきちゃったね……。
とりあえず、粘着されて荒れるのもアレなんでしばらく放置推奨?
682デフォルトの名無しさん:2007/03/01(木) 08:13:28
だろうね。ここの過去ログか本スレの方か忘れたけど同種の質問は以前にも
議論されているので本当に知りたい人は当面そっちを参照してねということで。
683デフォルトの名無しさん:2007/03/02(金) 16:38:17
http://www.cvc.uab.es/~javier/CrossVisions/Help/manhtml.html
lispで画像処理ができるなんて知らなかった
一番メジャーなのはこれなのでしょうか?
googleの検索でtopに出たので
684デフォルトの名無しさん:2007/03/06(火) 07:35:54
lisp使ってる人ってエディターはemacsなのでしょうか?
685デフォルトの名無しさん:2007/03/06(火) 10:16:20
vim
686デフォルトの名無しさん:2007/03/06(火) 19:26:17
xyzzy
687デフォルトの名無しさん:2007/03/06(火) 22:38:11
emacs21
688デフォルトの名無しさん:2007/03/06(火) 23:25:15
xemacs
689デフォルトの名無しさん:2007/03/07(水) 00:23:46
meadow
690デフォルトの名無しさん:2007/03/07(水) 01:04:57
構造エディタ
691デフォルトの名無しさん:2007/03/07(水) 01:22:40
イメージの保存ができれば repl だけで
692デフォルトの名無しさん:2007/03/07(水) 21:11:16
cよりちょっと遅い程度の処理速度が実現できるのってECLでしょうか?
693デフォルトの名無しさん:2007/03/08(木) 00:41:39
>>684
CLISP, SBCL, CMUCL, SCL, ECL, ABCL では Emacs + SLIME が今や標準的地位を占めている。
AllegroCL なら ELI, LispWorks なら附属のエディタ (Zemacs ライク) という撰択もある。
あと Corman も附属のエディタが主流みたいだね。
熱烈な vi 派なら vim で SLIME プロトコルを一部実装した Lisp モードもあるが、
せっかく Lisp やるなら Emacs を覚えて損はない。Lisp の経験がほぼそのまま
Emacs にも使えるんで相乗効果ですばらしい。クロージャがないとか
仕様の違いがわかるようになればそれは貴方の学習が進んだ証拠だ。
言語マニアになると Emacs Lisp の仕様にケチをつけはじめたりするが、CL パッケージ
で我慢するか Emacs をハックするのが正しい姿。

Windows 限定で xyzzy という手もある。
694デフォルトの名無しさん:2007/03/08(木) 00:58:37
Emacs系のエディタは一度は使ってみるべきだよね。
抜けられなくなるまで使い込めば、XKeymacsでWin環境での操作が極楽になるという特典も付いてくる。
695デフォルトの名無しさん:2007/03/08(木) 01:00:25
Emacsenのなにがいいかって、Ctrl+でカッコを移動できること。
これを極めると、
「はて括弧なんてあったかいのう?」大変だ!おじーちゃんがLisp脳でボケちゃった!
が実現できる。
696デフォルトの名無しさん:2007/03/28(水) 10:46:11
lispで自動でマルチスレッド化するものってありますか??
697デフォルトの名無しさん:2007/03/29(木) 00:39:38
自動でマルチスレッドってどんな感じ?もうちっと具体的な質問を頼む。
Cray 用の AllegroCL とかは並列化に強そうだが、そゆ話だろうか…
698デフォルトの名無しさん:2007/03/29(木) 11:18:01
lispぐらい抽象度の高い言語ならば、評価時に処理を並列化することが
可能ではないかと思ったんです。
JavaやC++のようにthreadを意識しなくてもロジックの依存度を解析して
自動で並列化するlispの処理系なりライブラリがあるんではなかろうかと。
699デフォルトの名無しさん:2007/03/29(木) 11:26:16
(func (f 12) (f2 14))
なんて関数があったとしたら、func評価時に(f 12)と(f2 14)を自動で並列化
してくれるみたいな。
700デフォルトの名無しさん:2007/03/29(木) 12:18:05
common lispの場合

左から順に処理する。
それぞれの関数が副作用があるかもしれない。

というわけで自動でやられると困りそう。

lispよりも関数型でしか書けなさそうな言語の方が良いです。

http://www.mu.dk/cl-muproc
701デフォルトの名無しさん:2007/03/29(木) 15:12:58
364 名前: 名無しさん@1周年 投稿日: 2001/01/03(水) 06:46

gotoの欠点って何だっけ?




365 名前: 名無しさん@1周年 投稿日: 2001/01/03(水) 06:58

>>364
後藤さんへの差別
702デフォルトの名無しさん:2007/03/30(金) 19:26:16
>>700
サンクス〜
haskellとかならパラレルになるのかな。
lispでもスコープ外の変数に参照を持たない関数のみを並列対称にすれば
出来そうな気もするけど・・・abcl改造してしてみよっかな・・・
703デフォルトの名無しさん:2007/03/31(土) 00:54:53
Connection Machine の *Lisp みたいにプログラマが明示するタイプの
並列化じゃだめなんか?
704デフォルトの名無しさん:2007/04/01(日) 13:52:18
lispってソケットも使えないんだろ?
705デフォルトの名無しさん:2007/04/01(日) 14:34:54
そういう意味では「Cもソケットは使えない」よねw
706デフォルトの名無しさん:2007/04/01(日) 17:58:46
OpenMPのようにシングル・マルチコアの両環境でソースを使いまわせるように
したい。これからはメニーコアの時代らしいのでそうならんかな〜と。
707デフォルトの名無しさん:2007/04/02(月) 22:51:19
デバッグ用のプリント文を if の then の位置等に入れるときにはどうしてますか?
プリント文が不必要なときには
(if ...
 (then の内容
とシンプルに書けますが,必要になると
(if ...
 (progn
  (format ...
  (then の内容
どうしても progn を入れる必要があるかと思います。
デバッグを終えたときにただプリント文をコメント化するだけなのか,
また progn をはずして綺麗にするのかいつも悩みます。
708デフォルトの名無しさん:2007/04/02(月) 22:58:50
気に病むくらいなら常に cond を使おう。cond は伝統的な良い構文だ。
あと、else部が要らないときは when、then部が要らないときは unless を使うのも手だね。
709デフォルトの名無しさん:2007/04/02(月) 23:07:55
cond っすか? なるほど〜。
たしかにその行を削るだけで済むか。
なんとなく Bourn Shell みたいだ。w
さんきゅです。
710デフォルトの名無しさん:2007/04/02(月) 23:11:20
デバッグ出力は基本的に消さずに #+nil とかでコメントアウトしておくだけだなあ。
今必要ってことは将来また必要になるかもしれないし。

あと、デバッグ出力に頼ったということはコードだけではわかりづらかったという
ことなので、その旨コメントを書いておくことが多い。
711デフォルトの名無しさん:2007/04/02(月) 23:14:55
すみません。#+nil っていうのはなんでしょうか?
google 先生が教えてくれません。。
712デフォルトの名無しさん:2007/04/03(火) 00:13:03
これじゃね? ttp://www.lisp.org/HyperSpec/Body/sec_2-4-8-17.html
C言語で言う #if 0 ... #endif
713デフォルトの名無しさん:2007/04/03(火) 00:16:39
(progn無しに)ifとかで使うと見つけにくいバグを起こしそうで不安だよね。
トップレベルとか、それに近い見晴らしの良い場所では使うけど。
714デフォルトの名無しさん:2007/04/03(火) 01:57:05
思い切って if* を使うという手あるな…。
ttp://lispuser.net/memo/lisp/2007-01-25-20-50.html
715デフォルトの名無しさん:2007/04/03(火) 02:31:46
>>714
これは好きになれないなぁ。ここまでシンボルで駆動するのってどうよ、っつーか。
:then :else みたいにせめてキーワードシンボルだったらまだ許せるかもしれんが。
同じ理由でCLtL2のLOOPマクロも好きになれない。
716デフォルトの名無しさん:2007/04/03(火) 08:15:06
>>715
しかし構造のみであらわすより名前で明示するほうがいい場合もあるしなー
とか loop も Edi Weitz 氏が多用してるのを見て許せるようになった俺がいってみる。
717711:2007/04/03(火) 08:25:23
う〜ん。。なるほど。#+test って言うのが有ったんですね〜。
基本的にはこれは実装依存コードを書くのに使うんだけど、
C の #DEBUG とかみたいなテクニックにも使えると。
718デフォルトの名無しさん:2007/04/04(水) 02:50:39
on lisp p56のour-mapcanで質問です。
(apply #'mapcar fn lsts)の部分が何をやっているのかわかりません。
(mapcar fn lsts)と同じかと思って、
(apply #'mapcar #'sqrt '(1 2 3))とやってみたのですがエラーになります。
719718:2007/04/04(水) 02:52:32
質問直後にわかりました。失礼しました。
(apply #'mapcar #'sqrt '((1 2 3)))
720flatline ◆r6EONKKhcc :2007/04/04(水) 11:59:55
On Lisp翻訳者です.
このスレも(専ブラでw)チェックしてますんで何かありましたらどうぞ.
だからと言って毎日即座に有益なお返事ができるとは限りませんが...
721デフォルトの名無しさん:2007/04/04(水) 21:05:37
>>720
・・・ホンモノか??
722デフォルトの名無しさん:2007/04/04(水) 23:07:14
>>721 本物だろ。
723デフォルトの名無しさん:2007/04/06(金) 01:14:34
Practical Common Lispの日本語訳マダー?
724デフォルトの名無しさん:2007/04/06(金) 02:08:41
『たのしいCommon Lisp』が出るのはいつですか?
725デフォルトの名無しさん:2007/04/09(月) 21:27:34
>>724
地獄Lispはでているようですが?
http://jigoku.bugyo.tk/
726デフォルトの名無しさん:2007/04/09(月) 21:44:56
なにこれ?

(= 1 1)
=> #t

どうみても Scheme です。本当にありがとうございます。
727デフォルトの名無しさん:2007/04/09(月) 21:47:06
スキームだって広い意味ではリスプですよ。コモンリスプじゃないけど。
728デフォルトの名無しさん:2007/04/09(月) 21:56:13
Practical Common Lispの日本語訳マダー?
729デフォルトの名無しさん:2007/04/09(月) 21:58:05
誰かやってんの?隠し立てするなよ。w
730デフォルトの名無しさん:2007/04/10(火) 07:04:41
リリカルLisp欲しかったなあ・・・
731デフォルトの名無しさん:2007/04/10(火) 08:09:39
let は macro を使うと lambda と変数の束縛の形に書き直せますが、
multiple-value-bind と values の組は書き直せますか?
S 式の構文解析をするような事をしてるのですが、
多値が出てくると手に負えません。
また、そういうのは何を見ると分かるのでしょうか?
732デフォルトの名無しさん:2007/04/10(火) 08:24:30
別の質問です。
eval に、コンパイラ自身のデバッグオプションみたいな、
式を評価してその途中を表示するような機構はないですよね〜?
dissassemble の手前みたいな。。
gcc の RTL は S 式に対応してますが、
RTL 生成後のコンパイラの backend 部分を
フォロー出来るようなオプションです。そういうのは実装依存ですか?
733デフォルトの名無しさん:2007/04/10(火) 23:19:12
>>730
知人にドン引きされた。Scheme と名乗っていて欲しかったよ…
734デフォルトの名無しさん:2007/04/10(火) 23:46:53
>>731
> S 式の構文解析をするような事をしてるのですが、
> 多値が出てくると手に負えません。

これだけじゃ何をやろうとして、何がどう手に負えないのかわからん。
多値は最小 20 個程度なんだから評価器に組み込んでおくべきじゃないかなー。

>>732
まず eval にはコンパイラは使われない。大抵インタプリタで動作する。
コンパイラの挙動がどこまで見えるかは実装依存。たとえば ACL には :explain で
コンパイラがどんな型を推論したかや、変数の boxing、クロージャの割り当
てなどがコンパイル時に表示される機能がある。
735デフォルトの名無しさん:2007/04/11(水) 02:11:00
>>730
かなりあまってるらしいね。
736デフォルトの名無しさん:2007/04/11(水) 02:18:47
関東(秋葉の店とか)で売ってるならネタで買ってもいいけどなぁ。。
なんとかフェスティバルに行く勇気はなかったわw
737デフォルトの名無しさん:2007/04/11(水) 06:03:44
>>731
多値の束縛を lambda で書き直したい、ってこと?
措いて、一応 multiple-value-bind はマクロだよ。一番下の notes 参照。
http://www.lispworks.com/documentation/HyperSpec/Body/m_multip.htm

とはいえじゃあ multiple-value-call をどうすんのかって話になりそうだけれど。
目的によっては values を list に、multiple-value-call を apply に置き換えるので何とかならんかな。
738デフォルトの名無しさん:2007/04/11(水) 07:22:59
>>737
多値なしの評価器で lambda のみで書き直すのは難しいんじゃないかな。
multiple-value-call はスペシャルオペレータだし、values -> list, multiple-value-call -> apply
の変換はやっぱり一般化できない。
(lambda () (if (= (random 2) 1 (values 2 3))))
739デフォルトの名無しさん:2007/04/11(水) 08:01:33
多値を返すことは継続を複数の引数で呼び出すことだから、CPS に変換すれば
lambda だけで書き直せるよ。
Common Lisp では末尾呼び出しの最適化が保証されないし、できるというだけで
あまり意味がないと思うけど。
740デフォルトの名無しさん:2007/04/11(水) 13:00:16
Scheme信者が迷い込んできたなw
741731:2007/04/11(水) 18:39:24
皆様,有難うございます。難しそうだ,ということが分かりました。w
今回は lambda にこだわらずになんとかベタに評価器部分に書き込む事にしました。
別に Common Lisp にこだわってるわけじゃないんですけど,
資産の問題が。。それから,継続の仕組みを使うところだけ
外部 Scheme を呼べたら面白いかも。って思いました。
もちろん,FFI を使えばいいんでしょうけど,なんとなくスマートでないような。。
宗教戦争はおいておいて,
あんまり Common Lisp から Scheme を呼ぶような,もしくは逆の
プログラムを書く人はいなさそうですね。w
742デフォルトの名無しさん:2007/04/11(水) 18:44:45
full continuationを実装するとevaluatorの造りが大きく影響される。(いろいろ制約が増える)
そういうわけで結構実装が難しいので誰も作らないのかも。
743デフォルトの名無しさん:2007/04/11(水) 20:25:03
>>741
CL で実装された Scheme を使えば継続つかえるよ。
でも俺は混在させようとは思わないけどな・・・。
継続はあらゆる問題を解決する魔法じゃないしね。

継続よりも効率的な Python みたいな yield や、Erlang みたいな
軽量プロセスが欲しい。そうゆうインターフェースを実装したライブラリ
では満足できない。処理系組み込みのがほしい〜。
744デフォルトの名無しさん:2007/04/12(木) 21:55:35
>>743 その願望、お前はオレか
Pythonのyieldとcall/ccの効率に差があるかどうかは実装によるのでは。
745743:2007/04/12(木) 22:46:13
む?yield はあんまり検討してないからそうなのかも。

Erlang のプロセスは皆が憧れてるだろ?海外でも Lisper は皆大抵
Erlang スキーだし。よく論争になってるし。俺が Erlang を知ったのは
何年か前の ポーカーサーバを Lisp で書くよ → Erlang のほうが楽だった…これイイわ みたいな記事だったし。
cl-muproc でガワだけは真似できても、やぱっり組み込みじゃないと
性能がでない。というかスレッドと Erlang プロセスが 1:1 では重すぎる。
やっぱり実装レベルで軽量プロセスをサポートしてくれないと、でも Lisp だと
副作用があぅあぅあぅ。 Franz か LispWorks かどっちかが実装してくれんかなぁ。
746デフォルトの名無しさん:2007/04/13(金) 00:40:38
ポーカーサーバーを書くのはCLよりErlangのほうが楽だったという記事はこれ?
http://wagerlabs.com/2006/8/25/writing-low-pain-massively-scalable-multiplayer-servers

Erlangに憧れてるなら素直にErlangを使えばいいんじゃないの。
747743:2007/04/13(金) 23:18:27
>>746
それそれ。つうか素直に Erlang をつかってるとも。だけど、CL + 並列プログラミングが
個人的には理想に近いかなーと思うわけ。いや、Erlang の機能に不満があるわけじゃないんだが…。
なんつうか、関数とマクロとか好きなレベルで抽象化できるのに慣れていると、もうちょっと
好き勝手したいなーとか思うんだよ。メッセージによるプロセス間通信は「正しい事」のような予感する。
748デフォルトの名無しさん:2007/04/14(土) 10:45:29
>>728
今、気合いだけで訳してる(240ページまでいった)けど
英語が苦手せいか(英検5級w)なかなか進まない・・・
そもそもきちんと理解できてるかどうかも疑問だけど
全部訳せたらPeterさんにメール送って公開してもいいかどうか聞くつもり。
749デフォルトの名無しさん:2007/04/14(土) 12:13:11
>>748 !!! 本スレ >>789 !!!
750デフォルトの名無しさん:2007/04/14(土) 12:20:55
> 全部訳せたらPeterさんにメール送って公開してもいいかどうか聞くつもり。

全部訳してから許可もらうのかよ! 逆だろ! 他にも作業してる奴がいるかもしれないとは
おもわなかったんかい。同時多発車輪の再発明は Lisper の常だなぁ…。
751748:2007/04/14(土) 12:29:53
>>749
うわーん、嬉しいのか、悲しいのかよくわからない気分になってます(;つД`)
>>750
・途中で挫折する可能性大
・きちんと訳せる自信がなかった
だったのできちんと完成させてからにしようと思ってました。
・空気読まずにマイペースで訳を続ける
・PAIPかSmall Piecesの訳にチャレンジしてみる
上の選択肢ならどっちがお薦めですかね?
752デフォルトの名無しさん:2007/04/14(土) 13:09:38
PCL も PAIP も Small Pieces も出版物なんだから出版社に権利があるだろう。
個人で権利関係がなんとかできるとはおもないし。だから「やってるよー」とどっか宣言はしとけよ。
コソーリやってたら誰もコンタクトとれないじゃん。PAIP 欲しいな。
753デフォルトの名無しさん:2007/04/15(日) 20:48:10
>>748
よく理解していないものが訳したものというのは、混乱させられる原因になる.
PCLは精力的にやっておられる方が訳をしているようだから、公開されたら良い
見本になると思うよ。自身で訳したものとの違いをしっかり検討して実力に蓄
えると考えればいい。748さんなら、現在のど根性訳は人生の中の練習問題だと
おもえばいい。
754デフォルトの名無しさん:2007/04/15(日) 21:25:46
すみません、commonlispの入門書とか読みながらemacsの中でrun-lispして遊んでる程度の人です。
関数の振る舞いでワケがわからなくなったので教えてホシイ事があります。
emacs-lispで
(functionp '+)
とするとtが返りますがCLISP上で同じ事をするとNILが返ります
同じように判定するにはどうするのだろうとCLISPのfunctionpの項目を眺めていたのですが
(functionp #'+)
であればTを返す事を知りました。
このfuncitonpの振る舞いの違いというか、変数に束縛してある関数が関数であると知る簡単な方法がわかりません。(#'が何をする物かもわからんのです,ググレナイ)

755デフォルトの名無しさん:2007/04/15(日) 21:42:19
>>754
CommonLispの変数は値と関数を同時に持つことができるのだよ。
ふたつのセルを持っていると思えばよい。
#'は変数から関数の方を取り出す操作
756デフォルトの名無しさん:2007/04/15(日) 22:06:43
elisp との違いは単に仕様が違うってことなんじゃないの

common lisp の functionp は引数が関数であるかどうかを判定する。
elisp の functionp は引数が関数または関数定義を持つシンボルであるかどうかを判定する。
757デフォルトの名無しさん:2007/04/15(日) 22:17:20
>>754
「シンボル」それ自体は「関数」ではないということ
シンボルから「関数」を取り出すのが #' の役目
758デフォルトの名無しさん:2007/04/15(日) 22:34:56
>>754
変数というか Common Lisp ではシンボルに値セルと関数セルという別々のスロットがある。
それぞれ関数で取り出せる。値セルは (symbol-value 'symbol) で参照できるし、関数セルは
(symbol-function '+) で参照できる。

(functionp '+) == (functionp (symbol-value '+))
(functionp #'+) == (functionp (symbol-function '+))

「変数に束縛」という理解から「値スロットへの束縛」と「関数スロットへの束縛」という二種類を
まず意識するといい。効率が悪そうに見えるかもしれないが、ローカルな束縛ならコンパイラはシンボル
を作成せずに効率よく扱ってくれるんで実際は効率問題にはならない。
759デフォルトの名無しさん:2007/04/15(日) 23:04:56
> (functionp '+)  == (functionp (symbol-value '+))
これは違うだろ
760デフォルトの名無しさん:2007/04/15(日) 23:25:49
> (functionp #'+) == (functionp (symbol-function '+))
'+ ならいいけど、誤解を招かないとも限らないので一応

* (flet ((f ())) (functionp #'f))
T

* (flet ((f ())) (funcitonp (symbol-function 'f)))
Error in KERNEL:%COERCE-TO-FUNCTION: the function F is undefined.
[Condition of type UNDEFINED-FUNCTION]
761758:2007/04/16(月) 00:45:56
ギャー。間違えた。試さずに書込むとダメだな…。
指摘サンクス。でも初心者には説明不足じゃね? >>759 >>760
俺が責任をもって説明しよう。

1. 「シンボル」に値スロットと関数スロットがある (という理解でいい)
2. functionp はパラメータそのものを評価する (これが >>759 の指摘)
(functionp '+) => NIL : (type-of 'x) => SYMBOL
(functionp #'+) => T : (type-of #'+) => COMPILED-FUNCTION
3. シンボル + は COMMON-LISP では特殊な意味を持つ (なのせ + や * というシンボルを解説につかうのはいくない)
*、 **、 *** : それぞれ直前の評価の値、ニコ前の値、三コ前の値
+、 ++、 +++ : REPL で評価した直前のフォーム、ニコ前のフォーム、三コ前のフォーム
4. flet, labels はローカル関数を定義するが、それはシンボルへの束縛を作るわけじゃない。
(これが >>760 の指摘)
5. #' (function オペレータ) は関数定義をレキシカル環境から探索する。見つからなかったらグローバルな関数定義をさがす。

で、例は↓みたいな事がいいたかんたよぅ。

CL-USER> (defvar x nil)
X
CL-USER> (type-of (symbol-value 'x))
NULL
CL-USER> (functionp (symbol-value 'x))
NIL
CL-USER> (setf x #'+)
#<SYSTEM-FUNCTION +>
CL-USER> (type-of (symbol-value 'x))
COMPILED-FUNCTION
CL-USER> (functionp (symbol-value 'x))
T
762748:2007/04/16(月) 01:52:40
>>753
そうですね、例外のところなんか読んでて意味がよくつかめてなかったり
してましたから・・・
でも途中まででも訳したのは良い経験になったと思います。
763デフォルトの名無しさん:2007/04/16(月) 02:26:46
754です。
何かCommonLispとelispの差異(というかオールドファッションなlisp全部?)で一番こんがらがりそうな部分ひいちゃったんでしょうか?
最初の書き込みの時に何をしでかして躓いたのか書かなかった僕が悪いのですが。
'( 1 2 3 4 5 + / * - +)
こういうリストを食わせてRPN電卓もどきな処理をする際に食ったリストの中で関数に割り当てられたシンボルだったらそれをfuncallしようとしていたのです。
そこでfunctionpが何食わせてもNILを返してきてパニックに陥ってこのスレに駆け込み寺しました。(#'がgoogleで検索できない文字列だと言うのもびっくりでしたが)

CommonLispのシンボルには値と関数の2つの割り当てスロットがある事までは理解しましたが
この場合
(setq plus '+)
(functionp plus) -> NIL
(functionp #'plus) -> ERROR ←なんとなく関数スロットに何もないからだと言うのはわかる
(funcall plus 1 2) -> 3
なぜにfunctionpがnilなのにfuncall可能なのかがさらにわからないのです。
764デフォルトの名無しさん:2007/04/16(月) 02:43:49
>>763
> (setq plus '+)
この時点で、plusというシンボルの「値」スロットに + というシンボルが入る。
> (functionp plus) -> NIL
シンボルというものは「関数」ではないので当然NIL
> (funcall plus 1 2) -> 3
plusの「値」は + なので、これは
(funcall '+ 1 2)
と同じ。
実は funcall は第1引数にシンボルが来ると、そのシンボルのグローバル関数スロットの値を
自動的に取り出すという(ややおせっかいな)機能があるので、これは動作する。

シンボルが関数として定義されているかどうか調べるのは fboundp を使うのが良いだろう。
で、真だったらそのシンボルを funcall へ渡すことができる。
765デフォルトの名無しさん:2007/04/16(月) 22:57:20
オレンジニュースからきました。

こ、これは・・・
ttp://www.cs.stevens.edu/~dlong/images/rider.gif
766デフォルトの名無しさん:2007/04/16(月) 23:40:24
仮面ラムダー ストロンガー
767デフォルトの名無しさん:2007/04/17(火) 00:07:14
意味不明〜〜! ww
768デフォルトの名無しさん:2007/04/17(火) 01:15:36
>>765
なにこれ仮面ラムダー?
769デフォルトの名無しさん:2007/04/17(火) 02:11:03
>>763

754 で入門書読みながらっていってたけど、何読んでるの?

> なぜにfunctionpがnilなのにfuncall可能なのかがさらにわからないのです。

functionp は引数のオブジェクトを評価しない(スロットの参照にいかない)ので、
(functionp '+) は「シンボル + は関数か?」という意味になる。当然 NIL。
(functionp #'+) は「関数 + は関数か?」という意味なので T

funcall は第一引数に「関数修飾子 (function designator)」をとる。これは関数もしくは
グローバル環境で関数名を表わすシンボルね。後者なんで functionp が NIL でもシンボル +
を funcall できるわけ。今は + を上書きしたりはしてないだろうから、#'+ == (symbol-function '+) ね。
770デフォルトの名無しさん:2007/04/17(火) 09:06:23
>>754
> (#'が何をする物かもわからんのです,ググレナイ)

遅レスだけど、

'bar が (quote bar) であるのと同様に
#'foo は (funtion foo) と同じこと。

' も #' もよく使うから省略形が用意されてると思えばいいよ。
771デフォルトの名無しさん:2007/04/17(火) 11:38:21
すみません
clispからsbclへと移ったのですが
clispだと引数に対象ファイルを指定してやればそのままそのファイルの
プログラムが実行されてました。

sbclだとそのまま引数に指定しても何も起こらないのですが
sbcl --loadとするとどうやらそれ以降に指定したファイルを実行できるようです
ところがSBCL is free...というバナーメッセージまで表示されてしまい、これを消したいのですが
(clispだとファイルを指定すればバナーが消えて結果だけが表示されてました)
これはどうすればいいのでしょうか?

どなたか教えてください
772デフォルトの名無しさん:2007/04/17(火) 11:55:32
すんません
マニュアルに書いてありました
吊ってきます...
773デフォルトの名無しさん:2007/04/17(火) 23:21:43
すみませんもう一つ質問させてください
sbclでsb-bsd-socketsパッケージを使って

(defun test-send (server port msg)
(let ((mysock (make-instance
'sb-bsd-sockets:inet-socket
 type :datagram
:protocol :udp)))
(sb-bsd-sockets:socket-send mysock msg 10
:address (list server port))))

(test-send "127.0.0.1" 2344 "hello world")

こういうコードを書いて、C言語で書いたUDPクライアントと通信させようとしましたが
どうも
The length requested (9) does not match the type restriction in
(SIMPLE-ARRAY
(UNSIGNED-BYTE
8)
(4)).
と出てしまってどうしてもコードが通りません
どこが間違ってるのかさっぱりわからないのですが
どなたか教えてくれると幸いです
774デフォルトの名無しさん:2007/04/17(火) 23:37:00
(sb-bsd-sockets:make-inet-address "127.0.0.1")
#(127 0 0 1)
775デフォルトの名無しさん:2007/04/17(火) 23:44:13
>>774
すみません、もうちょっと詳しく教えていただけませんか?
776デフォルトの名無しさん:2007/04/17(火) 23:47:27
>>775
すみません、わかりました
777デフォルトの名無しさん:2007/04/18(水) 01:03:23
754です。
>>764
fboundpを用いてシンボルに関数割り当てがされているかの判断はできるようになりました。ただこの関数に関数でなく生の数値がバインドされたシンボルを食わせるとエラーになる理由は理解していません。
<<<(and (symbolp someting) (fboundp someting))とする事で回避はできました>>>
初学者にとって非常に興味深いのは
(setq something 1)
(fboundp something) ->エラー
(setq something '+)
(fboundp something) ->t
になることです、僕の様な初心者はsomethingに数値がバインドされているのであればfboundpはnilを返すべきではないかと思うわけです。
このあたりの解説がわかりやすく書いてある書籍などあれば助かるのですがどなたか参考文献などを紹介してくれませんでしょうか。
>>769
毎日コミュニケーションズの入門common lispを使っています。(というかelispの方はずいぶん昔に購入したelispマニュアルのドラフト版で学びました)
そのようなわけで違いのわかる書籍があるといいのですが、あいにくそういう物は無くてorz

スレで親切な返事を書き込んでくれた皆様にここで纏めてお礼を申し上げます(すっごい勉強になったです)
稚拙なコードですがclisp上でrpn電卓で遊んだ結果をここに書き込んでおきます。(何でトラブったかすぐにわかってもらえると思います)
(defun rpn (args)
(let ((stack (list)))
(mapcar (lambda (arg)
(cond ((and (symbolp arg) (fboundp arg)) (push (funcall arg (pop stack) (pop stack)) stack))
(t (push (eval arg) stack)))) args)
(print (pop stack))))
次はもっと困った時だけ質問するように努力します(できたらこれ買って読め馬鹿って本ありましたら紹介お願いします)
778デフォルトの名無しさん:2007/04/18(水) 01:11:34
>>777
> ただこの関数に関数でなく生の数値がバインドされたシンボルを食わせるとエラーになる理由は理解していません。
> <<<(and (symbolp someting) (fboundp someting))とする事で回避はできました>>>

それは fboundp に「シンボル」ではなく、生の「数値」を食わせたから。
fboundp は普通の関数なので、引数は評価される。だから

> (setq something 1)
> (fboundp something) ->エラー

では something が変数として評価されて (fboundp 1) や (fboundp '1) と同じことになる。
(数値は評価するとそれ自身になる)

関数を呼び出す場合、その引数は事前に評価されるわけだが、マクロだとか特殊形式(quoteやfunctionなど)
の場合は暗黙には評価されない。(マクロの場合、結果的に評価される場合はある)
779デフォルトの名無しさん:2007/04/18(水) 03:15:59
(setq x 10)
とやって
(let ((x 20))
 (symbol-value 'x))
とすると10が返されるんですが、この場合、xと20はどのようにして結びつけられて
いるんでしょうか?
780デフォルトの名無しさん:2007/04/18(水) 08:01:12
>>779
symbol-value cannot access the value of a lexical variable.
ということなので、つまり、let内の変数xにはアクセス出来ない。
ダイナミックスコープ(ここでは外部変数x)になる。
let内外の2つの変数xは見た目は一緒だが、内部では別という事も付け加えておくね。
781デフォルトの名無しさん:2007/04/18(水) 18:36:53
>>780
symbol-functionも同じだとすると
グローバル変数の関数を入れる場所にはdefunなり(setf (symbol-function 'x) #'(lambda ~)
などでアクセスできても、レキシカル変数では関数を入れる場所にはアクセスすることができないという
ことになるんでしょうか?
782デフォルトの名無しさん:2007/04/18(水) 19:16:06
そういうことになります。

http://www.lispworks.com/documentation/HyperSpec/Body/f_symb_1.htm
> setf may be used with symbol-function to replace a global function
> definition when the symbol's function definition does not represent a
> special operator.
783デフォルトの名無しさん:2007/04/18(水) 19:25:38
>>781
ごめん、誤読してた。>>782 は無し。
784デフォルトの名無しさん:2007/04/18(水) 21:16:14
>>781
レキシカルに関数を束縛できるのは labels と flet だけじゃないかな。
setf ではアクセスできないと思う。
(言ってる意味を取り違えてるかな?)
785デフォルトの名無しさん:2007/04/18(水) 22:28:25
>>784
えっとレキシカル変数の「値を入れる場所」に値を入れるには
(let ((x10))
で、
「値を入れる場所」に関数を入れるには
(let ((x #'(lambda
を使ってできるけど
レキシカル変数の「関数を入れる場所」に関数を入れることは
symbol-functionではレキシカル変数の「関数を入れる場所」にアクセス
できないから、レキシカル変数の「関数を入れる場所」に関数を入れることが
できないのかどうなのかを確かめたかったんです。(ああややこしい・・・)
786デフォルトの名無しさん:2007/04/18(水) 22:33:35
>>777
ふーむ。入門 Common Lisp は読んだことないのだよなー。ポールグレアムの ANSI Common Lisp と培風館の Lisp I, II も
読むと良いよ。後者は日本語訳がいけてないのと誤植が気になるが内容は良い。Practical Common Lisp も翻訳進行中とのことでめでたいね。
Emacs Lisp の経験があるといってたがスタイルがらしくないな? CL にも dolist があるから、 CL 風味ならこんなかんじかねぇ。

(defun rpn (args &aux stack)
(dolist (arg args)
(cond ((and (symbolp arg) (fboundp arg))
(push (funcall arg (pop stack) (pop stack)) stack))
(t
(push (eval arg) stack))))
(print (pop stack)))
787デフォルトの名無しさん:2007/04/18(水) 22:44:28
>>785
その言い方を借りると、レキシカルの「関数を入れる場所」に関数を入れるのが flet と labels だ。
(let と let* に相当する)
788デフォルトの名無しさん:2007/04/18(水) 22:48:07
Erlang使いはまだこのスレにいる?
仕事でErlangを使っているのかどうか気になる。
差し支えのない範囲でこのスレかErlangスレで語ってほしい。
789デフォルトの名無しさん:2007/04/18(水) 22:58:19
何回来たってスレ違いだよ
790デフォルトの名無しさん:2007/04/21(土) 22:29:36
typedef struct _pkt_header {
unsigned char op_code;
unsigned long payload_len;
} pkt_header;
ある特定のデータブロックから
こういうpkt_headerにデータを入力する

pkt_header header = (pkt_header*)ptr
見たいな処理ってどうやってLispで実現すればいいのですか?
またpkt_headerのような構造体をどうやってLispで定義すればいいのですか?

Lispには型がないのでどうやっていいかさっぱりわかりません

どなたか教えてください。
791デフォルトの名無しさん:2007/04/21(土) 22:35:32
(defstruct pkt-header ...)
(setf header (make-pkt-header ...))
792デフォルトの名無しさん:2007/04/21(土) 22:40:34
>>761
unsigned char op_code;
unsigned long payload_len;
の部分はどうすればいいのでしょうか?

当方IA-32で開発しておりますので
unsigned charは8ビット(1 byte)
unsigned longは32ビット(4byte)
という風に型を固定にしたいです

ネットワークから流れてくるデータのヘッダ処理をしたいのですが。
793デフォルトの名無しさん:2007/04/21(土) 22:40:53
キャストしてるとこから見ると、バイトデータをデコードする方法を知りたいようにも見えるな。
どちらにしても質問の趣旨がちょっと曖昧。
794デフォルトの名無しさん:2007/04/21(土) 22:46:53
>>793
言葉が足らず申し訳ありません。
それです、バイトコードをデコードしたいのですが
どうすればよいのでしょうか?
795デフォルトの名無しさん:2007/04/21(土) 22:52:23
(unsigned-byte 8) とかするだけだろ。
対象言語を全く知らずに開発できるわけないんだから、せめて言語仕様くらい
ちゃんと目を通しとけよ。
796デフォルトの名無しさん:2007/04/21(土) 22:53:56
各処理系のFFIのあたり見ろで終りじゃないかな。

#そういう所に終始するならCが一番楽だと思う。
797デフォルトの名無しさん:2007/04/21(土) 23:07:52
(defstruct pkt-header
(op-code 0 :type (unsigned-byte 8))
(payload-len 0 :type (unsigned-byte 32)))
でおk
798デフォルトの名無しさん:2007/04/22(日) 00:03:14
>>786さんありがとう
教えていただいた培風館の方は見つかりませんでしたがANSI CommonLispの方は入手できました。
elispのスタイルらしくないのは本当にエディタのマクロとしてしか使ってないのでLispらしいことは何もしてきていないからです。
文脈で解釈異なる置換とかを正規表現ひねり出すより楽に制御したいとか、人様の設定ファイルを自分用にとかその程度なものですから。
799デフォルトの名無しさん:2007/04/22(日) 00:46:02
>>794
read-byte を駆使して抽象化層を組み立ていくのが基本かな。
どのくらい抽象化できるかは、自分の技量次第。たとえば Practical Common Lisp を読めば
http://www.gigamonkeys.com/book/practical-parsing-binary-files.html
↓のような感じ。個人的には C よりバイナリの扱いは楽だなー。性能は C のほうが上だけど。
(define-binary-class packet-header ()
((op-code u1)
(payloead-length long)))
あとはバイナリをバッファから解析してけば C の構造体のように使えるよ。

>>798
あぁ、map とか使ってるから Scheme かじった事あるのかと思ったんだよね。まー気楽にどうぞ。
CL の世界は副作用避けろとか、do 使うなとか末尾再帰しろとか言われないよ。最初は慣れた
スタイルでよちよち歩いてきゃいいのさ。心掛けさえ間違えなきゃ、スタイルなんざいつでも訂正きくからね。
800デフォルトの名無しさん:2007/04/22(日) 23:43:43
ちょっと興味があるんですが、日本語の文字コードでShift_JIS、EUC-JP、UTF-8、
ISO-2022-JP、UTF-16の相互変換と入出力に対応してて、日本語で正規表現の
検索ができて、httpとftpとsmtpとpop3のライブラリがついてて、WindowsとLinuxで
動作する無料でオープンソースな処理系はありませんでしょうか。。。
801デフォルトの名無しさん:2007/04/23(月) 00:18:33
ネタ臭い質問だねぇ。そーゆうスクリプト言語ぽい希望なら Python か Ruby
でいいんじゃない? Common Lisp なら… ABCL かねぇ。っても、希望の
ライブラリは全部 Java のライブラリにお任せなので文句は Sun にいってくれ。

まぁ「ありません」ってことだね。Scheme でいいなら Gauche とか。
802デフォルトの名無しさん:2007/04/23(月) 00:28:58
>>800
基本はCLISPであとは適当なライブラリを探せば済むんじゃないかな
803デフォルトの名無しさん:2007/04/23(月) 00:34:53
何かやりたい事が決まってるんじゃないの。取り敢えず CLISP か SBCL をインストールして、
ライブラリは http://www.cliki.net/networking とかから探して来るとヨロし。
804デフォルトの名無しさん:2007/04/25(水) 06:46:32
ttp://www.shiro.dreamhost.com/scheme/trans/noop-j.html
3. (一部)
Lispハッカーがリストにシンボルをプッシュして済ますようなことさえも、
数々のクラスとメソッドからなる一つのファイルになってしまう。

リストにシンボルをプッシュして済ますって具体的には
どういうテクですか?
805デフォルトの名無しさん:2007/04/25(水) 07:11:17
> Common Lisp なら… ABCL かねぇ。

ワロタ
806デフォルトの名無しさん:2007/04/25(水) 13:58:40
すみません
sbclの
The variable |0X10| is unbound
というエラーはどういうエラーのときに出るものなのでしょうか?
807デフォルトの名無しさん:2007/04/25(水) 14:14:42
>>806
> The variable |0X10| is unbound
> というエラーはどういうエラーのときに出るものなのでしょうか?

sbclは知らないけど、CommonLispでは||で囲まれたものは
シンボルと解釈されます。
たとえば、

(setq |1234| 5678)
|1234| ;; => 5678 が返ってくる。

ってな感じ。

なので、上記のエラーはシンボル|0X10|は値を持たない、
って意味だろうね。
808デフォルトの名無しさん:2007/04/25(水) 19:32:56
>>806
もしかして16進の数値のつもりで0X10とか書いて無いだろうな?
809デフォルトの名無しさん:2007/04/26(木) 03:51:30
ありそうな話だ。
16 進は #X ね。
http://www.lispworks.com/documentation/HyperSpec/Body/02_dhi.htm
810デフォルトの名無しさん:2007/04/27(金) 01:27:02
今 lisp のパーサを作ろうと思っているのですが、
そのへんの文法の仕様書ってネットで見れないのでしょうか?
>>809のところがやっぱり良いのかしら
811デフォルトの名無しさん:2007/04/27(金) 20:22:14
>>810
> 今 lisp のパーサを作ろうと思っているのですが、
> そのへんの文法の仕様書ってネットで見れないのでしょうか?

Common Lispなら

http://www.cs.cmu.edu/Groups/AI/html/cltl/cltl2.html
812デフォルトの名無しさん:2007/04/28(土) 00:38:00
complexが使えるのはありがたいのですが、3次以上の時限を持つベクトルデータをlisp上で
演算子を使った関数表記をするにはどうしたらよいのでしょうか?
813デフォルトの名無しさん:2007/04/28(土) 02:01:55
韓国の方ですか?
814デフォルトの名無しさん:2007/04/29(日) 01:29:58
http://cybertiggyr.com/gene/lisp-cgi/cgi.lisp
ここにあるCGIパッケージをSBCLで使おうとして

(load (make-pathname :directory '(:relative)
:name "cgi"
:type "lisp"
:version :newest))
とすると
The name "CYBERTIGGYR-CGI" does not designate any package.
と出ます。

これはどのように解決したらよいのでしょうか?

http://cybertiggyr.com/gene/lisp-cgi/cgi.lisp
がCLISP用なのでこれをSBCLでも使えるように

(defpackage "cybertiggyr-cgi"
(:nicknames "cgi"))

(in-package cybertiggyr-cgi)

(defun getenv (x)
"Returns the value associated with an environment variable.
Implementation depends on the underlying Lisp system."
(sb-ext::posix-getenv x))
最初の部分をこのように書き換えました。

どなたか教えてください。
815デフォルトの名無しさん:2007/04/29(日) 01:32:19
パッケージ名は文字列で指定するなら大文字で
816デフォルトの名無しさん:2007/04/29(日) 01:44:51
http://cybertiggyr.com/gene/lisp-cgi/cgi.lispを
(defpackage cybertiggyr-cgi
(:nicknames cgi))

(in-package cybertiggyr-cgi)

(defun getenv (x)
"Returns the value associated with an environment variable.
Implementation depends on the underlying Lisp system."
(sb-ext::posix-getenv x))
に書き換えました。
すると
; in: DEFUN GETENV
; (CYBERTIGGYR-CGI::DEFUN CYBERTIGGYR-CGI::GETENV (CYBERTIGGYR-CGI::X)
; "Returns the value associated with an environment variable.
; Implementation depends on the underlying Lisp system."
; (POSIX-GETENV CYBERTIGGYR-CGI::X))
;
; caught COMMON-LISP:STYLE-WARNING:
; undefined function: DEFUN
;
; caught COMMON-LISP:WARNING:
; undefined variable: GETENV

; (POSIX-GETENV CYBERTIGGYR-CGI::X)
と出てしまうのですが...これはどうなってるんでしょうか?さっぱりわからないです...
817デフォルトの名無しさん:2007/04/29(日) 02:16:49
; undefined function: DEFUN
で何か気がつかないかね?
ヒント:defpackageの:useオプション
818デフォルトの名無しさん:2007/04/29(日) 02:31:19
>>817
ありがとうございます。できました!
819デフォルトの名無しさん:2007/04/29(日) 07:47:33
>>811 CLtL2 より HyperSpec のほうがいくね?

>>812 (vector 1 2 3) => #(1 2 3) とかそゆ話?

>>818
SBCL は CGI には向かないよ。Java や Ruby on Rails が CGI に向かないのと同じで、
フットプリントがでかいから。CL-HTTP とか mod_lisp とか hunchentoot とか。今だと
hunchentoot かな。
820デフォルトの名無しさん:2007/04/29(日) 10:41:24
>>819
> >>811 CLtL2 より HyperSpec のほうがいくね?

どうだろ…
まあ、811が「仕様書」って言ってたから、仕様書ならCLtL2のほうだろうと…その程度。
821デフォルトの名無しさん:2007/04/29(日) 15:47:26
>>819
フットプリントとはなんでしょう?
822デフォルトの名無しさん:2007/04/29(日) 15:53:44
この場合,消費メモリの量
823デフォルトの名無しさん:2007/04/29(日) 15:59:31
CLISP とか OpenMCL が 2MB くらいで動く所、SBCL はデフォで 20MB くらい
お取りになられるからなあ。起動時にヒープサイズを指定出来るようになると良いんだけど、
今の実装じゃ無理だよね。
824デフォルトの名無しさん:2007/04/29(日) 16:00:31
なるほど
しかしsbclのほうがいろいろライブラリ周りとかそろってて便利なのでは?
今はメモリも安くなったし、大丈夫かなーなんて...
825デフォルトの名無しさん:2007/04/29(日) 16:14:40
メモリ消費量が絶対的に大きすぎるというより、そんな大きなプロセスを毎回生み殺すのが気分悪い
ってことだね。CGI以外の手法について学ぶと良いだろう。
826812:2007/04/29(日) 19:05:34
>>819
(+ (vector 1 2 3) (vector 3 4 5)) -> #(4 6 8)
こういう事したいのですが、常にvec+とか自分で定義しないといけないんでしょうか?
次数も様々なものを使ってみたいのですが。

複素数は (+ #C(1 2) #C(3 4) ) -> #C(4 6)
の様に通るのですが、任意次数のベクトル演算は何故できないのでしょう?

827デフォルトの名無しさん:2007/04/29(日) 19:07:46
>>826
つAPL
828デフォルトの名無しさん:2007/04/29(日) 19:08:32
自分のパッケージで + を再定義すればいいじゃん
829819:2007/04/30(月) 00:32:01
Common Lisp の「数」の体形にベクタは入ってないから。複素数とベクトル演算は違いが大きすぎるからだろ。
↓こんな意見は何故だめなんだ?いちいち
集合っぽくしたいよ!! (+ (vector 1 2 3) (vector 3 4 5)) => #(1 2 3 3 4 5)
数値の演算はこう!! (* 2 (vector 3 4 5)) => #(6 8 10)
そんなのおかしいだろ…常識で考えて…とか思うかもしれないが、いろんな場合があるからねー。
皆好き勝手いいはじめたら収集つかんし。828 の言うように、やりたきゃ自分でつくれという事。対した手間ではない。
(defpackage :oreore-matrix (:use #:cl) (:shadow #:+))
(in-package :oreore-matrix)
(defun + (&rest vectors) ...)
830デフォルトの名無しさん:2007/04/30(月) 00:34:56
(defun + (&rest numbers-or-vectors)
  (etypecase (car numbers-or-vectors)
    (vector (let ((result (copy-seq (car numbers-or-vectors))))
              (dolist (x (cdr numbers-or-vectors) result)
                (map-into result #'+ result x))))
    (number (apply #'common-lisp:+ numbers-or-vectors))))

(+ #(1 2 3) #(4 5 6))
=> #(5 7 9)
(+ #(#(1 2) #(3 4)) #(#(5 6) #(7 8)))
=> #(#(6 8) #(10 12))
831デフォルトの名無しさん:2007/05/01(火) 13:46:34
829-830
ありがとうございます。
まさにそれを欲していました。
でもどこかにMathパッケージありそうな気もするのに何故に見つからないんだろう orz

こつこつ作って整備して精進します。
832デフォルトの名無しさん:2007/05/01(火) 22:36:56
やりたいことによっては、 R 使うって手もありそうだね。
ttp://www.okada.jp.org/RWiki/?%A5%D9%A5%AF%A5%C8%A5%EBTips%C2%E7%C1%B4#content_1_1
833デフォルトの名無しさん:2007/05/02(水) 04:10:31
>>831
この辺はもう見た?
http://www.cliki.net/mathematics
834デフォルトの名無しさん:2007/05/02(水) 13:51:02
lisperならば、maximaをやればいい。統計はもちろんRの方が御勧め。
昔のものならxlispstatという手もある。xlispstatをclへ再実装プロ
ジェクトでもないんだろうかね。
835デフォルトの名無しさん:2007/05/09(水) 18:04:18
最近どうですか?
836デフォルトの名無しさん:2007/05/09(水) 18:35:36
ぼちぼちでんなー
837デフォルトの名無しさん:2007/05/10(木) 13:44:57
ここすごい過疎ってるけど
質問があれば比較的高速に返答がくれますよね
おそらく偉大なLisperがROMってくれているんですね
ありがたいことです
838デフォルトの名無しさん:2007/05/10(木) 21:06:01
>>837
ごめん、黙ってたけど……
質問にはおれがLispで書いたAIが回答してるんだ
839デフォルトの名無しさん:2007/05/10(木) 23:19:56
>>838
グレアムキター
840デフォルトの名無しさん:2007/05/10(木) 23:55:43
アベコベガエル
841デフォルトの名無しさん:2007/05/11(金) 23:38:13
Common Lisp の function-lambda-expression に対応する
Scheme の関数はなんですか?
842デフォルトの名無しさん:2007/05/12(土) 01:53:14
Schemeでは原理的にそういう操作は禁止なんじゃないかな。
処理系依存ならできるものもあるだろうけど。
843デフォルトの名無しさん:2007/05/12(土) 12:11:47
>>842 え〜!!! そうなんですか。

define にて関数 f を定義することで、
f の値を求める事と f の関数定義を構文解析することとを
同時に行いたかったのですが。
quote を使って関数定義部を書いて eval を使って値を評価するのは、
なんとなくイケて無い様に思えるのですが普通はそうするのですか?
(スレ違いスマソ)
844デフォルトの名無しさん:2007/05/12(土) 15:58:54
>>843
そういう場合にはマクロで隠蔽してしまえばよろし。
関数は定義された時点でVM用のコード、あるいは機械語に落とし込まれたりする場合が多いので、
レアケースのために全体をS式で覚えておくのはムダだからだ。
845デフォルトの名無しさん:2007/05/12(土) 23:43:12
>>843
なんでそんな事したいんだ?何か目的があるんだよな?
手段よりも目的をさきに語ってくれたほうがネタがでやすいと思われ。
846デフォルトの名無しさん:2007/05/13(日) 00:33:57
>>841
俺は別にかまわんが、どっちかっていうとこっちのスレの方が妥当なんではあるまいか。
http://pc11.2ch.net/test/read.cgi/tech/1177065699/
847デフォルトの名無しさん:2007/05/13(日) 10:11:31
(defun (setf foo) ...) の意味が調べても今一分からない。
良ければ教えてくれませんか?
(例えば、ANSI Common lisp p 114の (defun (setf bref) ...))
848デフォルトの名無しさん:2007/05/13(日) 16:38:53
On Lisp
汎変数
849デフォルトの名無しさん:2007/05/13(日) 20:28:41
λ...
本スレはやっぱり。。
850デフォルトの名無しさん:2007/05/14(月) 16:59:26
>>848
さんくす。defunで汎変数が定義出来るのですね。
851デフォルトの名無しさん:2007/05/16(水) 23:06:05
clispでlispの勉強をしています。
マクロの中のマクロもmacroexpandするにはどうしたらいいでしょうか?
たとえば、以下の例だと progn の中の incf も展開した形で見たいのですが・・

[1]> (macroexpand '(progn (incf aaa)))
(PROGN (INCF AAA)) ;
NIL
852デフォルトの名無しさん:2007/05/16(水) 23:54:21
>>851
SBCL だけどこんなかんじ。でも、素直に (macroexpand '(incf aaa)) とかしないと
人間の脳味噌だとあっというまに対応取れなくなっちゃうよ。SLIME の操作を覚えて
S 式撰択 → Macroexpand の手順を覚えるのが吉。

CL-USER> (defun macroexpand! (expr)
(if (atom expr)
expr
(macroexpand
(cons (macroexpand! (car expr))
(macroexpand! (cdr expr))))))
MACROEXPAND!
CL-USER> (macroexpand! '(progn (incf aaa)))
(PROGN
(LET* ((#:G3015 1) (#:G3014 (+ AAA #:G3015)))
(SETQ AAA #:G3014)))
NIL
853デフォルトの名無しさん:2007/05/17(木) 00:06:57
本スレ >>200
入力と出力を調査する対象な任意のプログラムなん?それとも四則演算 + 自前オペレータのみ?
簡単なインタプリタ書いて、結果を実行するかわりに入出力を集めていくのかなー。
日本語で、オンラインで読めて、短いインタプリタだとこのへんか?
ttp://lispuser.net/memo/lisp/2006-12-08-03-54.html
評価するかわりに入出力のグラフを作りあげていくようにするんかなぁ。
854デフォルトの名無しさん:2007/05/18(金) 00:23:22
>>852
ありがとうございます。

macroexpandが展開するのはリストの car部分がマクロの場合だけ。
今回のケースだと展開したいと思ってた incf は cdr にあるから展開はしてくれない。
cdrの中のマクロも展開したいなら自分で書くしかない。

ってことですね。
とりあえず、SLIMEとかを覚えようと思います。
855デフォルトの名無しさん:2007/05/18(金) 00:54:21
そゆこと。で、なんで皆 macroexpand で満足するかというと、
1. 全部展開したい事は稀 2. 自分で作ってもあんま手間ではない 3. SLIME 使えばほぼ不要
というあたり。なんで不要かというと、
http://lispuser.net/memo/emacs/2006-12-20-20-36.html (後半の移動系操作に注目)
http://lispuser.net/emacs/lisphacking.html (SLIME のキー操作に注目)
これを組み合わせてつかうから。展開したい式の先頭へ移動した後、 C-c RET (macroexpand-1) もしくは C-c M-m (macroexpand)
で展開形が別ウィンドウに表示されてとても便利。
856855:2007/05/18(金) 00:59:25
h 抜き忘れて直リンしちゃった… orz
857デフォルトの名無しさん:2007/05/18(金) 01:07:11
いまどき抜く必要(意味)なんてないよ
858デフォルトの名無しさん:2007/05/22(火) 18:03:03
今、ウェブ・サービスの多くが、
Javaや.NETベースのアプリケーションサーバや、
Perl/Ruby/PHP/Python等のLightweight Languageの上に構築されていますが、
なぜそこにLispが含まれていないのでしょうか?
859デフォルトの名無しさん:2007/05/22(火) 21:09:38
一本釣りじゃなくて二本釣りだったみたいだな
860デフォルトの名無しさん:2007/05/25(金) 12:34:41
恥ずかしい質問なんですが、
(setf y '(setf x 1))
でyに代入された(setf x 1)
ってデータですよね?
これって文字列なのでしょうか?
861デフォルトの名無しさん:2007/05/25(金) 12:42:38
文字列ではありません
862デフォルトの名無しさん:2007/05/25(金) 12:49:52
ではなんと言うデータ型に属するのでしょうか?
863デフォルトの名無しさん:2007/05/25(金) 12:58:16
「リスト」というデータ型に属します
864デフォルトの名無しさん:2007/05/25(金) 13:05:52
んじゃ、フォームではないリストなんですね。
setfはただのデータであり要素なんですね。
865デフォルトの名無しさん:2007/05/25(金) 13:14:29
はい。setf は単なるシンボルです。
866デフォルトの名無しさん:2007/05/25(金) 21:35:01
初めての人のためのLispという古い本をもらったのですが、
中に著者で竹内郁雄という人のサインが書いてありました。
竹内郁雄って言う人はどのくらいの有名人なのでしょうか?
持ってた方がよいですか?
867デフォルトの名無しさん:2007/05/25(金) 21:44:06
有名度は井田昌之と同じくらいなので、持ってたほうがよいです
868デフォルトの名無しさん:2007/05/25(金) 23:04:01
>>866
最近たらいまわし関数が流行ったけどあれを考えた人
869デフォルトの名無しさん:2007/05/25(金) 23:12:43
ブックオフへたらい回ししちゃ駄目だぞ
870デフォルトの名無しさん:2007/05/25(金) 23:19:40
ちょっと前に似たような質問があるけど

ttp://blog.livedoor.jp/dankogai/archives/50838479.html

> 条件式の結果を左辺に書ける言語って、C/C++以外にあるのだろうか。

これをやってみようとして

(let ((x 0) (y 0))
 (set (if t x y) 3)
 x)

ってやってみたんだけど 0 が帰ってきて上手く束縛されない
set ってレキシカル変数には使えないと言うことだったのね
(set 'x 0) と (setq x 0) って等価だと思ってた

で上記を set から setq にしても上手く行かない
(setq (if t 'x 'y) 3) じゃダメだった(当たり前か)
setf でも判断できないしレキシカル変数にたいする set みたいな命令は無いのだろうか
871デフォルトの名無しさん:2007/05/25(金) 23:21:54
>>870
最初の (if t x y) 間違いw
(if t 'x 'y) だった
872デフォルトの名無しさん:2007/05/26(土) 00:39:16
スレストしちまった orz
873デフォルトの名無しさん:2007/05/26(土) 01:10:34
今までLispは見た目わかりにくそうな感じなので全く使ったことなかったけど、今日暇だったことも
あり、emacs lispを少し触ってみた。
意外と悪くないかなという感じなので、色々と使ってみようと思うんだけど、みなさんどんな
用途にLisp使ってます?

874デフォルトの名無しさん:2007/05/26(土) 02:09:26
>>867
>>868
わかりました。
良く分からないですけど、大字にとっておきます。
>>869
誰がうまいこと言えと(ry

ちにみに「下らぬ本に感化されぬよう御注意」って書いてありました。
875デフォルトの名無しさん:2007/05/26(土) 02:23:17
下らぬレスに感化されぬよう御注意
876デフォルトの名無しさん:2007/05/26(土) 02:28:34
>>870 の答えは・・・誰か・・・
877デフォルトの名無しさん:2007/05/26(土) 09:19:54
>>873
ちょっと重い計算。
あとはいろいろやりたいけど、そこまでやってない。Practical Common Lisp
と言う本のようにやってみたけどな。
878デフォルトの名無しさん:2007/05/26(土) 15:05:01
(defun double (x) (doublex))
(defun doublex () (+ x x))
(setf x 7)
(+ (double 0) x) =>21
ってC言語で言うと
#include <stdio.h>
int hoge (void);
int i = 7;
int main (void){
int i =10;
int v = hoge();
printf ("%d\n",v);
return 0;
}
int hoge(void){
return x+x;
}
と同じことでしょうか?
そしてこれがレキシカルスコープってやつですか?
879デフォルトの名無しさん:2007/05/26(土) 19:07:53
>>870
こんなんじゃ駄目?

(defmacro set-eval (place value)
(let ((x (eval place)))
`(setf ,x ,value)))

(let ((x 0) (y 0))
(set-eval (if t 'x 'y) 3)
x)
880デフォルトの名無しさん:2007/05/26(土) 20:02:27
本スレの荒れっぷりを見て釣りっぽいのに安易に回答するのはどうかと思っていたけど。

>>878
C のコードの hoge 関数が間違っているよ。x => i に置き換えれば挙動は似ているが、C の動作に
おきかえて Lisp を理解するのは良くないと思う。C の main 内の int i がレキシカルスコープというなら
そうかもしれないが、たとえば C では main 内の int i をクロージャに閉じ込めて main のスコープ終了後に
使うという事ができない…といっても C で理解していると main が終った後(C では main は特別な関数だからね…)?
クロージャ?ととりあえず関係無いところでひっかかるからね。

>>879
ダメだと思うよ。それマクロ展開時に値が確定しちゃうから元の C や Perl 版とは挙動が異なる。
素の CL ではシンボルからレキシカル変数の値を実行時に取得することはできない。
個人的には不要と考えているが、どうしてもやりたきゃ展開形を↓のようにする必要がある。
(if 条件
(setf x value)
(setf y value))

881デフォルトの名無しさん:2007/05/26(土) 21:12:07
やってみた

(defsetf if (test then &optional else) (v)
  `(if ,test (setf ,then ,v)
     ,(if else `(setf ,else ,v))))

(let ((x 0) (y 0))
  (setf (if t x y) 3)
  x)
882デフォルトの名無しさん:2007/05/26(土) 21:33:55
>>879
おぉー出来た、すごい
>>880 氏の弁だと if の部分がコンパイル時に評価されちゃうから実はダメってことなのかな?
でもコード書いてくれてありがとう
感謝

>>880
たしかに言うようにこういう処理自体やる機会ってのはほとんどないし利点も薄いから
たぶんアプローチ自体間違っているんだろうね
ただ Lisp は他の言語では制御構文でしかない if でも値を持っているのでこんなの簡単にできる
と思って意地になってハマっちゃったよw

>>881
おぉぉおぉおおおお!
でけた!
defself ってこう言うときに使うんだぁ
言語で言語を拡張すると言う Lisp のハック精神炸裂だ
よっし、C や Perl に勝った!

オレってなんて稚拙な精神構造なんだろ
とほほ
883デフォルトの名無しさん:2007/05/26(土) 21:34:59
defsetf だった
もうこんなんばっかw
それにしても Lisp はおもしろい
884デフォルトの名無しさん:2007/05/26(土) 21:53:05
>>881
コメントさせてもらうと、else を省略可能にしないほうがいいね。
(setf (if nil x) 10) とかのケースを考慮しないと。

>>882
そう、if に関してはアプローチが間違っている。Dan Kogai の出してる例だと
substr 等に関しては setf が一般解を出している。setf を拡張可能にする事により、
ユーザーが定義したデータ構造にも setf できるようになってるわけ。

でも、あまり黒魔術的な技で勝ち負けを考えないほうがいいと思うよ。C や Perl がチャンピオンだからね。
885デフォルトの名無しさん:2007/05/26(土) 23:26:19
言語勝負厨は来ないでほしい
886デフォルトの名無しさん:2007/05/27(日) 00:18:50
厨って言葉を使って、勝った気になってる奴うぜー
887デフォルトの名無しさん:2007/05/27(日) 00:24:41
>>886
厨うぜーwww
888デフォルトの名無しさん:2007/05/27(日) 00:29:49
>>887
おめーがうぜーよ
自重しろ
889デフォルトの名無しさん:2007/05/27(日) 00:32:53
  ┏┳┳┓     ハイ.     ┏┳┳┓
┏┫┃┃┃     雑談は   ┃┃┃┣┓
┃┃┃┃┣┓   ここまで ┏┫┃┃┃┃
┃      ┃┃┏━━━┓┃┃      ┃
┃ 雑談   ┣┫ . ・∀・ ┣┫. STOP!┃
┗━━━━┛┗┳━┳┛┗━━━━┛
            ┏┻┓┃
        ┏━┛  ┣┻┓
        ┗━━━┫  ┗━┓
.             ┗━━━┛
890デフォルトの名無しさん:2007/05/27(日) 01:19:35
>>884
判ってるよw
だからとほほな精神構造だなと自戒しまして

しかしマクロが強力な Lisp は黒魔術の幅も広そう
他の言語だと結局言語を再実装する形になりそうだ

ただマクロは強力すぎるから適用範囲を掴むまでは手を出せないかなぁ
On Lisp と Shiro 氏のマクロの記事読んで感覚はつかめたけど
たぶん解っているだけで判っていないと思う
891デフォルトの名無しさん:2007/05/27(日) 01:31:42
最近の動的言語のパズル的魔術を黒魔術とすればLispのマクロは白魔術ですよ
892デフォルトの名無しさん:2007/05/27(日) 01:36:22
JavaScriptって地味に黒魔術の塊だとおもってたんだけど、
リフレクションに類するものは非推奨になってるんだな。つまらん。
893デフォルトの名無しさん:2007/05/27(日) 04:35:43
clisp何でインデントしようしてもtabキーが使えないんですけれども、
これって仕様ですか?
894デフォルトの名無しさん:2007/05/27(日) 09:05:53
>>893
コンパイル時にreadlineライブラリが組み込まれてないんじゃないかなぁ。

*features*は確かめてみた?
895デフォルトの名無しさん:2007/05/27(日) 13:38:27
>>892
プリコンパイルしてJVMやCLIで(JavaやC#並に)効率よく動かそうというというのがあるから、
動的言語でもそういう機能は嫌われる傾向かも。(スレチすまん)
896デフォルトの名無しさん:2007/05/27(日) 14:34:20
deduceってどういうときに使うの?
897デフォルトの名無しさん:2007/05/27(日) 14:36:41
ごめんreduce
898デフォルトの名無しさん:2007/05/27(日) 15:25:36
>>896-897
ちょっとでも計算量を少なくしたいときfold⇒reduceにする。
集合が単位元をもたないときもreduceを使わざるを得ない。
899デフォルトの名無しさん:2007/05/31(木) 01:08:10
>>890
適用範囲はかなり広いから、やれなくなるよ。
ちょうど、孫悟空が三蔵法師らと天竺にでかけるが、近づこうとすれば
遠くなるみたいな感覚はにてるよ。w
900デフォルトの名無しさん:2007/05/31(木) 06:29:00
ひさしぶりにLispの本を買いたくなって本屋で色々見たけど
結局お金が足りなかったので何も買わずに帰った
901デフォルトの名無しさん:2007/05/31(木) 22:18:06
まず金を稼ごうぜ
902デフォルトの名無しさん:2007/06/01(金) 01:58:46
Lispやれば金になるよ。






なんてな。
903デフォルトの名無しさん:2007/06/01(金) 02:02:02
金持ちの lisper なんて本当に存在するか疑問だ…
904デフォルトの名無しさん:2007/06/01(金) 06:01:04
むしろ金持ちだからこそLispができるのではないかと
905デフォルトの名無しさん:2007/06/01(金) 10:07:54
グラハムっちは金持ちじゃないの?
906デフォルトの名無しさん:2007/06/01(金) 16:48:07
(defun expt$ (m n)
(if (= n 0) 1
(* m (expt (- n 1) m) )))
すごい恥ずかしい質問なのですが、
expt$ (m n)と関数定義して、
(expt (- n 1) m)で引数の位置入れ替えているのに
なんでちゃんと計算できるのでしょうか?
JavaとかCでもちゃんと計算できましたっけ?
Lispが特殊なの?
907デフォルトの名無しさん:2007/06/01(金) 16:57:31
なんでちゃんと計算できていると思ったのですか?
908デフォルトの名無しさん:2007/06/01(金) 20:01:48
変な質問で申し訳ないが、lispでこれができるから好きっていうのがあると思うんですが、
lispのどこが好きですか?
lispのソース付でお願いします。

lispはかじっただけで、まったく知らないに等しいのですが、出力を意識しなくていいのが好きです。

'(javaだとSystem.out.print("??????")\;とか大変なんですよね。)
909デフォルトの名無しさん:2007/06/01(金) 20:12:36
「ハッカーと画家」でも買って読め
910デフォルトの名無しさん:2007/06/01(金) 20:16:19
>>908
> 出力を意識しなくていいのが

アハハハハハハハハハハハハハハハハハ
911デフォルトの名無しさん:2007/06/01(金) 20:44:31
>>907
私が馬鹿でした。
そりゃこの関数で
2の3乗計算しても同じ結果になるはずだ。
こんな罠があったとは!
912デフォルトの名無しさん:2007/06/01(金) 20:53:10
windowsでclisp, allegro, sbclを入れて、どれがアプリの配布に
向いていそうなのか見てみたんだけど、簡単なレポあった方がいいかな?
913デフォルトの名無しさん:2007/06/01(金) 21:44:56
>>908
余計なものがなく、コンパイラまでしっかり意識された仕様が決っているところが好き。
具体的にいうと (compile *) (disassemble *) が好き。
まぁ、関数名とか format とかにふざけてるとしか思えない機能とかあるけど歴史だしねぇ。
良くも悪くもコレだ。
http://www.lispworks.com/documentation/HyperSpec/Front/index.htm

打てば応答が帰ってくる REPL が気にいったってことかな。そうだとすると、なかなかイイセンスしてる。
ランタイムにコンパイルするっても JIT とは別なんだよなー。対話式なのとインクリメンタルな部分が。
914デフォルトの名無しさん:2007/06/01(金) 21:48:40
>>912 それだと CLISP だろう…

CLISP: スタンドアロン .exe 化できる。この中だとサイズも小さめ。
SBCL: Win32 はまだいろいろ制限多い。ランタイムデカいので .exe 化のメリットあんまりない。
ACL: .exe/.dll 化可能。だが、そもそも配布用ラインセスが高額。個人では無理。
LispWorks: .exe/.dll 化可能。Professional 版以上にはランタイムライセンスがついてくる。日本語回りは未知数。
915908:2007/06/01(金) 22:59:08
>>913
昔、若気の至りで買った"common LISP 第2版"を見てるんですが、compileとdisassembleの所ってかなりのページ数がさかれてて、仕様としてかなり確りしてそうですね。
かなりのページ数なので、読もうとして気が遠くなりました。^^
916デフォルトの名無しさん:2007/06/02(土) 00:35:35
>>914
確かにその通りだった。hello表示させるだけで、CLISPはイメージと
ランタイムあわせて8Mくらい。SBCLは20Mくらい。
ACLはTRIALバージョンだと、exeを実行するたびに、「sutdent ver買ってね」と
言われる。

少し間口を広げて、ISLISPのOpenLispも試してみたんだけど・・・
Freeバージョンはexe機能ないのね。マニュアルにはやりかたが
書いてあるけど、仕様が変わっていてあんまり役に立たない。
exe化のための、中途半端な機能だけ残ってた。
っていうか、ソースがOpenじゃないのに、OpenLispとは・・・
917デフォルトの名無しさん:2007/06/02(土) 00:41:27
コーマンリスプはどうだろう
http://www.cormanlisp.com/
918デフォルトの名無しさん:2007/06/02(土) 00:50:28
>>916
GCL や ECL とか?うーん Windows じゃあイマイチだねぇ。というか Lisp のほうが
「フリーソフト」だの「オープンソース」だのより古いんだからそゆ批判はちと的外れかも。
RMS も元は Lisp システムが使いたくて GNU はじめたのにね。まぁ、Symbolics の件もあって
CL は好きじゃないらしいが。

>>917
日本語がダメです。英語のみならかなりコンパイル速度といい統合されてるアセンブラといい
イイ処理系なんだけどね…。
919デフォルトの名無しさん:2007/06/02(土) 01:42:10
>>918
ついちょっと愚痴ってしまいました。いや、実はオープンソースでないことに
対して愚痴っていたのではなくて、紛らわしいところに愚痴っていたのです。

standalone exeができると書いてあったので、マニュアルみながら試行錯誤したら
全然マニュアルどおりでなく、仕方なくいろいろと付属のライブラリの中を見ると、
ISLISPをCにコンバートするものがあったんですが、その吐き出すCのコードをコンパイルするのに、
本体のコードが必要。それで"Open"ってついているからきっとどこかにソースが・・・と探して
徒労に終わってしまったので、つい(^^;

そうそう配布を考えなければ、SBCLはwindowsでも結構いけますね。
LTkも使えたので、GUIもOKでした。速度もCLISPに比べて10倍くらい速い。
スレッドは使おうとするとハングしてましたけど、意外といい感じでした。

lispはいい言語ですね。初めてソース見たときは、どう読んだらいいか
わけわから、ずかなりインパクトありましたけど。
920デフォルトの名無しさん:2007/06/02(土) 02:03:00
実は私も OpenLisp 経験があったりして。昔触ってた鯖に、なぜか OpenLisp が入っていてね。
Lisp はいい言語けど、最初のインパクトとうか精神的ダメージはでかいだろうな。見た目がアレだから。
よく再チャレンジする気になったね。2ch で聞くくらいだから身近に Lisp の師匠居ないんでしょ?
俺は師匠に出会わなきゃいろいろ理由をつけて蔑んでたままだったろうなぁ〜と今でも思う。

そうそう、TIME マクロも結構好きだね。俺は他の言語では profile する前に
t1=timeGetTime(); 処理; t2=timeGetTime(); print(t2-t1); .. みたいなお手軽計測を多用する
ダメ人間だったからね。TIME マクロみて、コードを「包み込む」系のマクロの便利さを知った。
921デフォルトの名無しさん:2007/06/02(土) 02:53:45
ACL高いって話を良く聞くけれど、
じっさいお値段はいくらくらいなの?
Franzのページにもお見積もりとか書いてあるだけだし
922デフォルトの名無しさん:2007/06/02(土) 08:10:21
(defun C (n k)
(if (= k 0) 1
(if (= n k) 1
(+ (C (- n 1) (- k1))
(C (- n1) k)))))
という関数で(C 4 3)の時の評価の過程が良く分からなかったので、
図に書いてみたんですけれど、もしよければ正しいか見ていただけないでしょうか?http://pc.gban.jp/?p=9066.jpg
923デフォルトの名無しさん:2007/06/02(土) 08:32:24
その理解で正しいと思うよ。
さらに (TRACE C) を使ったあと (C 4 3) を実行すると確認が楽。

CL-USER> (C 4 3)
0[6]: (C 4 3)
1[6]: (C 3 2)
2[6]: (C 2 1)
3[6]: (C 1 0)
3[6]: returned 1
3[6]: (C 1 1)
3[6]: returned 1
2[6]: returned 2
2[6]: (C 2 2)
...

以下ズラズラと表示される。ただし、深い再帰で表示すると終わらないので、そゆときは自力で print 入れるとかしよう。
924デフォルトの名無しさん:2007/06/02(土) 09:17:56
Win32でcusp使ってみたけど、Eclipse終了しても、SBCLがゾンビで残りません
か?(しかもCPU占有率50%程度で)
XP SP2, Eclipse3.2.2, Cusp for Windows 0.80 = sbcl 1.02
心当たりありましたら、ご教示いただけましたら幸いです。
925デフォルトの名無しさん:2007/06/02(土) 09:23:47
Cusp ってのは単に Eclipse が SLIME プロトコルしゃべるだけだと思うから、
Eclipse 側で終了時に SBCL を止める設定をしないとまだ残るでしょ。
SBCL 側を (quit) するようにフックしないといけないと思うんだけど Eclipse 手元にない。
SBCL も 4 ヶ月近く前の版ってことは Cusp ってあんまりメンテされてない?
Emacs + SLIME のほうがオヌヌメかも。
926デフォルトの名無しさん:2007/06/02(土) 09:57:32
>>925
ご教示ありがとうございます。了解しました。
Eclipseを終了してから、SBCLを終了するということですね。
まだ使いはじめたばかりで、設定がきちんとできていなかったかもしれません。
windows+xyzzyを使っているので、emacsはなんとなく抵抗があるのですが、
emacs+slimeも検討してみます。
927デフォルトの名無しさん:2007/06/02(土) 09:58:20
>>926
間違い訂正
Eclipseを終了する前に、SBCLを終了するということですね。
928デフォルトの名無しさん:2007/06/02(土) 10:19:22
>>921
20〜50万くらい
929デフォルトの名無しさん:2007/06/02(土) 10:40:22
>>928
100万超じゃなかったっけ?
かなり昔にOまたさんに聞いたのだが。下がったのかな?
930デフォルトの名無しさん:2007/06/02(土) 10:48:56
Edition によると思われ・・・。個人利用は Professional でいいけど会社で使うなら Enterprise でそ。
931デフォルトの名無しさん:2007/06/02(土) 13:25:02
>>928
>>929
>>930
なるほど、ACLのお値段はそれ位するのですか。
でも、思っていたよりは普通。
RISCマシン用の商用コンパイラもそれくらいするのが普通だし。
932918:2007/06/02(土) 14:49:06
>>920
実はlispはxyzzyのカスタマイズなどに使っているので、今では
普通のコードを読むのと対して違いを感じないんですが、
初めて見たときは驚きました。その当時いくつか読める言語が
あったんですが、読み方がさっぱりわからなくて。
emacs, xyzzyはlispのとっかかりとしてはいいですね。
豊富なソースと、簡単に動作確認できる環境が師匠って感じです。
933918:2007/06/02(土) 14:50:26
ところで、ECLについてもちょっと試してみました。
配布を考えるなら、windowsではECLが一番いいかもしれません。
(ただし、Cコンパイラが別に必要)
hello表示させるアプリで、全部で1.5M程度でした。(ecl.dll + test.exe)
もちろん、exeになります。あとコンソールアプリで日本語表示もOKでした。
Cとの親和性がとてもよく、Cができれば組み合わせていろいろできそうです。
コンパイルは一度Cのコードを吐き出して、インストールされている
コンパイラを使ってコンパイルする形になります。

またVisual C++2005を使って、ソースからコンパイルすることも可能でした。
その場合は、一部ソースを直す必要がありましたが、Cがある程度わかる人であれば
問題がない程度です。VC++の最適化は強力なので、こっちができる人は
こっちの方がいいかも。
934デフォルトの名無しさん:2007/06/02(土) 14:55:19
>>923
ありがとうございます。
TRACE関数はまだ勉強していないのですが、
便利ですね。
これで紙の上で書かなくて済みそうです。
ついでに末尾呼び出しについての質問です。
(defun gcd$ (m n)
(if (= m n) n
(gcd$ n (mod m n))))
の場合、末尾呼び出しとは
(gcd$ n (mod m n))の事をさすのでしょうか?
それとも(gcd$ 30 18)とした時の、
評価していって(gcd$ 12 6)になった時のことを言うのでしょうか?
末尾再帰は理解できるのですが、
本には以下のように説明してあるのですが、
「末尾呼び出しとは値を返す直前の関数呼び出しのこと→(gcd$ 12 6)
末尾呼び出しが再帰呼び出しになっているのが末尾再帰です→(gcd$ n (mod m n))」
とどちらともとれる説明になっていて困っています。
935デフォルトの名無しさん:2007/06/02(土) 16:05:53
>>934
1. (gcd$ n (mod m n)) の個所が「末尾呼び出し」の定義
2. 実際に実行される (gcd$ 12 6) が「末尾呼び出し」する
普通は JMP 命令になる。

普通の関数呼び出しでも、たとえば (mod m n) は関数呼び出しの定義で、
呼び出しの実行は (mod 30 18) なわけ。でもどっちも「関数呼び出し」って
言えば通じるよね。末尾再帰も慣れればいちいち定義と実行を分けて考えなくなるよ。
936デフォルトの名無しさん:2007/06/02(土) 21:03:37
引数の絶対値を返す関数をifを用いて定義したいんですが、どうやりますか?
937デフォルトの名無しさん:2007/06/02(土) 21:17:05
(defun my-abs (x) (if t (abs x)))


1. 絶対値の定義は何か、日本語なり自分のわかりやすい表記なりで書け
2. その表記では何らかの条件はないか、あるならそこに if が当て嵌められる
3. 条件はどんなものか。それは Lisp で書くとどうなる?
4. 条件が真のときは何を返し、偽のときには何を返すか。それは Lisp で書くとどうなる?

というステップを踏めば書けるだろ。あとは教科書でも読んでちゃんと復習しろ。
938デフォルトの名無しさん:2007/06/02(土) 21:22:09
なんというゆとり…これは間違いなく宿題。宿題なら宿題だとはっきり言わないと組込みの abs 関数使えで終ってしまうぞ。

(defun abs-936 (x) (if (minusp x) (- x) x))


もう、ここまでは読まないかもしれないが、別に宿題なら宿題ではっきり授業聞いてませんでした助けて!!
と言えばいいのに。なんでバレバレの質問するんだろう。真面目な回答者なら逆に気分を害して答えてくれないかもよ。
俺は本人のためにならない事大好きだからバンバンこたえちゃうけどね。
939デフォルトの名無しさん:2007/06/02(土) 21:28:07
>>937 >>938 は真面目すぎ。授業聞いてなかったのを後悔してるわけじゃねーんだぜ。
興味も関心もないんだって。本人が努力なんてする気もないんだから考え方とか教えても無駄だろ。
Emacs Lisp スレでも書いたが、興味もやる気もないし、礼儀もしらないんだから荒しと考えてさっさと
回答を与えて満足させるべき。

で、宿題なんだから minusp もダメだろう。おそらくベストな答はコレ。これで○もらえるはず。

(defun my-abs (x) (if (< x) (- x) x))
940937:2007/06/03(日) 00:00:30
>939
その意見には反対。興味がなくて授業も聞いてなくて、それでこういう場で宿
題を聞いているのだろうというのには同意するけど、そのまま答えを与えては
いけないとおれは思う。
こういうやつに答えをそのまま渡したらアホがアホなまま、なんとなく単位を
取れてしまうだろ。それが一番まずい。

それよりは、自力で解かせるべくヒントだけを与えた方がいい。それで自分で
問題を解けるようになればベストだし、そこでやる気を見せないやつは落第し
た方がいい。
941デフォルトの名無しさん:2007/06/03(日) 00:09:21
>こういうやつに答えをそのまま渡したらアホがアホなまま、なんとなく単位を
取れてしまうだろ。
社会にアホが
942デフォルトの名無しさん:2007/06/03(日) 00:11:07
このスレのレベルが急速に低下してるな……
943デフォルトの名無しさん:2007/06/03(日) 00:16:53
>>942
マルチ乙
944937:2007/06/03(日) 00:28:49
あ、「真面目すぎ」ってのについては賛辞として有難く受け取っておきます。

そもそも、やる気がなかろうが話を聞いていなかろうが、これが講師やTAなら、
そんな学生の事情とは関係なく、きちんと理解させるような教育をしなきゃいかんのよ。

宿題系の質問て、ようするに授業で対応しきれない学生へのTAの仕事をボラン
ティアでやっているのと同じなので、質問に答えるなら、同じようにちゃんと
質問者を教育する態度で臨まなければならない。
っておれは思っているので。
945デフォルトの名無しさん:2007/06/03(日) 00:34:10
真面目だな
946939:2007/06/03(日) 00:43:42
>>937 おまえ良い奴だなぁ。結構感心すた。まぁ、理想は買うけどね、実際のとこ
宿題って事を偽装したつもりでネットの暇人が答え書いてくれるだろうとか浅知恵する連中は
自分で考えたりしないし、感謝もしないよ。連中は答えを写して提出するだけ。

でも今後は「宿題であること」「やる気がありません」と明言されていない場合は
ズバリ答えを書くのは控える事にする。

……まぁ、Common Lispの宿題なんてのがそうそうあるとは思えないが。
947デフォルトの名無しさん:2007/06/03(日) 03:26:52
>>935
とても丁寧な回答ありがとうございます。
しっかり理解できました。
>>936
自分ならこうしますかね。
abs(x)
-x,x<0の時
x,それ以外の時
↓lispにすると
(defun abs$ (x)
(if (< x 0) (- x) x))
absは組み込み関数だから関数名はabs$にしました。

948デフォルトの名無しさん:2007/06/04(月) 01:34:35
Common Lisp 系のインタプリタ処理系をC++で実装しているんですが、
別に Common Lisp に詳しいわけじゃないので、
自分が知らない機能があるかもしれません。

せっかくなので一通りは実装したいのですが、
Common Lisp らしい(?)機能ってどんなのがあるでしょうか?

ちなみに GC とか クロージャは実装できました。
末尾再帰とか遅延評価とかって Common Lisp にあるんでしたっけ?
949デフォルトの名無しさん:2007/06/04(月) 01:37:36
すいません、ちょっとお尋ねします。
windows上のcommon lisp処理系で使える、以下の条件を満たす
プロットライブラリを探しているのですが、どなたか心当たり
ありませんでしょうか。

1. GUIで拡大縮小できるもの
2. 1.を満たし、かつ一画面に複数のグラフを表示できるもの
3. グラフを印刷可能なもの(もしくはpost scriptで保存できるもの)
(4. できれば、ソースが手に入るもの。)

いろいろと試してはみたのですが、どうもいいものが見当たりませんでした。
(gnuplotはマルチプロットした状態で、GUIで拡大縮小すると表示が
おかしくなります。またclplotは表示などはよさそうなのですが、
元になるplplotのライブラリは、windowsではマウスのイベントを
取得できるドライバが使えないようで、GUIで操作は難しそうです)

もしご存知の方がいましたら、よろしくお願いします。
950デフォルトの名無しさん:2007/06/04(月) 02:19:48
>>948
自分もあまりCommon Lispは知らないけれど(質問ばっかりしてるし)
まずはCommon Lisのインタプリタを作る以前に
Schemeのインタプリタから
作った方が良いと思う。
末尾再帰
(defun factorial (n)
factorial-loop (n 1 1))
(defun factorial-loop(n i p)
(if (> i n) p
(factorial-loop n (+ 1 i) (* i p))))
(factorial 5)

(factorial-loop 5 6 120)で返るよ。
再帰は
(defun factorial (n)
(if (= n 0) 1
(* (factorial (- n 1)) n)))
遅延評価は
On lispの214ページに実装例が書いてあります。

自分もいつかインタプリタ作ってみたいなぁ。
今読んでる本の最後の課題で作るけど。
951デフォルトの名無しさん:2007/06/04(月) 03:34:11
お恥ずかしい
(defun factorial (n)
(factorial-loop n 1 1))
で。
952デフォルトの名無しさん:2007/06/04(月) 10:10:44
>>948
Lisp らしいというとマクロだろうね。もう実装済みかもしれないけど。
あとは何だろう。多値とかかな?

末尾再帰があるとは?最適化が仕様で要求されてるかということなら、されてないよ。
遅延評価も仕様にはなかったと思う。
953デフォルトの名無しさん:2007/06/04(月) 22:46:08
>>948
プログラマブルなリーダーとかコンパイラとか。コンパイラマクロとか。
↓から好きなものを選べば?
http://www.lispworks.com/documentation/HyperSpec/Front/index.htm

>>949
うーん、心当りがないなぁ。Linux とか商用なら希望を満たすのがあるの?
954デフォルトの名無しさん:2007/06/05(火) 00:19:16
>>953
レス、どうもありがとうございます。
linux上ではplplotはマウスイベントを取得できるドライバが使える
ようですので、clplotからplplotを呼び出したりすればできそうな気がします。
(結構手はかかりそうですけど)

あとcommon lispではないのですが、lushという処理系がありました。
これはマウスイベントを取得する描画ルーチンがありましたので、
自分でプロッターを作ることはできそうです。どうやらこの処理系は、
数値計算重視のようですね。Cのコードをはいたり、独自の拡張で
Cのコードを中に埋め込むことができるみたいです。
(しかし言語仕様はcommon lispとはかけ離れていますけど)

う〜む、なかなか難しいですね。
少しずつlispで使えそうなライブラリを作って、いずれ大体のことは
lispでできるようにトライしてみます。
955デフォルトの名無しさん:2007/06/05(火) 00:48:47
>>950
>>952
>>953
どうもありがとうございます。多値なんてありましたね。
とりあえずはオプショナル引数とバッククオート文法あたりですかね。
プログラマブルなリーダーは
普通のS式の構文解析の時点でヒーヒー言っているんで…

ちなみに何で Common Lisp 系と言うと
自分が一番使っている処理系が xyzzy だからです。
xyzzy ならその場で実行できるしソースも見れるしと。

とりあえず現在たらいまわし関数を実行してみたんですが、
(tak 10 5 0) が xyzzy が1秒ぐらいで終わるのに
自分の処理系だと20秒ぐらいかかって遅すぎ…
956デフォルトの名無しさん:2007/06/05(火) 01:14:16
まてまてまて。まずさ、Lisp を作るんなら Lisp の勉強からはじめてみたらどうかな。
S 式の構文解析でヒーヒーとか、 (tak 10 5 0) で 20 秒というあたりからあんまり
C/C++ の経験もなさそうな気配。

CLISP で↓のようなドシンプルなインタプリタ動かしても 20 秒もかからないんで、どっかに
相当なムダがあると思われる。CLISP 2.41, PentiumM 1 GHz で 0.5sec だ。
http://lispuser.net/memo/lisp/2006-12-08-03-54.html
新機能もいいけどまず足場を固めてみてはどうだろうか。ソースのレビューくらいしたげるよ。
(でも GC が自作できるとの事なんで、ひょとすると見誤ってるかもしれないけど)
957デフォルトの名無しさん:2007/06/05(火) 01:38:12
>>948
実行系の設計に関するものに絞るとしても、とりあえず
signal/condition-case, catch/throw, block/return-from
くらいは必要でしょ。このへん無視すればそりゃ簡単だけど。

ほかには>>953が書いているようにリーダーとかマクロ回り。
958デフォルトの名無しさん:2007/06/05(火) 02:12:42
>>956
実は lisp C++ 共に経験はぜんぜん無いです。
まあ両方の勉強の為にやってるとも言えます。
だから実装効率は無視してクラスの設計を優先しました。
(だからって良い設計とはいえない気がするが)

ちなみに以前C#で作った処理系だと2〜3秒程度でした。
(クロージャなし、GCは.NETまかせ)

とりあえず遅い理由は cons をいちいち new しているのか
シンボルの束縛されている値と関数の取得が毎回
std::map<std::string, Symbol*>クラスの検索をしてるからっぽいですわ。
959デフォルトの名無しさん:2007/06/05(火) 02:23:41
>>957
あああ、制御系をすっかり忘れてました。
この辺ぜんぜん考えてなかった…
少なくとも block/return-from は無いと駄目じゃん…。
960デフォルトの名無しさん:2007/06/05(火) 02:24:30
まだ実力があんまり測れないなぁ。値の取得が <std::string, Symbol*> ってあたりからすると、毎回文字列からシンボル引いてるの?
そうだとすると、処理系製作するには Lisp の知識というかカンが不足してる気がする。普通の S 式はシンボルのツリーになるから
実行時に文字列からシンボルをいちいち引いたりしない。あと GC はどんな方式?

C# や C++ のテンプレートライブラリが使えるのに S 式の解析がつらいとか、技術レベルがちょっと
ちぐはぐな感じ。やる気はありそうだから、やっぱ作る対象もちゃんと勉強したほうがのびると思うよ。
いろんな言語で同じ水準の半端 Lisp を実装するより、まず腰を据えて Lisp に取り組むするほうがオヌヌメ。
961デフォルトの名無しさん:2007/06/05(火) 02:42:57
>>960
Symbol のクラスは std::string を持つだけのクラスで、
そのシンボルにどの値が束縛されているのかは
全体のテーブルから引く形になっています。

普通はSymbolに値と関数の領域を持たせるんですよね。
xyzzy のソース見てもそうなっていました。

GC はシンプルな Mark & Sweep で一応Cレベルのマシンスタックも走査しています。
この辺は Ruby のソースを見て参考にしました。
CG の最初と最後に printf しているのですが、
ぜんぜん時間はかかっていないみたいです。

S 式の解析は途中で継続可能(?)なのを作ったんですが、
この継続可能ってのが曲者でした。
説明しづらいですが、文字列をどこで切っても解析可能というか。

一段落したら Lisp の勉強をした方がよさそうですね。
962デフォルトの名無しさん:2007/06/05(火) 02:43:03
960に同意。普通はシンボルマップを検索するのはreadするとき(正確にはinternするとき)だけで済むはず。
963デフォルトの名無しさん:2007/06/05(火) 02:51:52
>>958
> シンボルの束縛されている値と関数の取得が毎回
> std::map<std::string, Symbol*>クラスの検索をしてるからっぽいですわ。

この辺が不思議。束縛をシンボルに入れるか外側に入れるかは、いろんな流儀があるけど、
どちらにしても文字列で検索するなんて話は出てこないはず。
ひょっとしてSymbolというクラスのインスタンスは同一文字列でも一つではないとか?
それって eq とか困らない?
964デフォルトの名無しさん:2007/06/05(火) 02:58:14
Lispのシンボルをまだよく理解してないってだけでしょ。
そうつっつかなくてもいいじゃん。
eqだってinternされてないシンボルというのがない(かつパッケージもない)
世界ならシンボルだけ特別扱い文字列比較でもいけるっちゃいけるんだし。
965デフォルトの名無しさん:2007/06/05(火) 03:04:31
>>964
eq と eql の区別がほどんど無意味になるけどね
966デフォルトの名無しさん:2007/06/05(火) 03:06:49
>>964
なんか、つっついてあげれば理解してくれる子だと思ったもんでつい・・・w
967デフォルトの名無しさん:2007/06/05(火) 03:12:01
いや、つっつくというより、皆なんかちぐはくな感じを受けてるんじゃないかな。
C# でも Lisp 作った事あって、最低でもこれが 2 作目なんだよね。

xyzzy のソースまで読んでるのに Symbol の intern を知らないとか、
Ruby の GC を参考に、C スタックのスキャンまでできるのに?(プロファイルはprintfベース?)
S 式の解析が継続可能?作る対象の勉強が後回しとか、

うーんいまいち実力が見えないんだけど。ソースを見せてもらうのが一番はやそうだけど、そゆの抵抗がある人?
xyzzy だと Windows 系だろうから見せると減るって人が多いかなぁ。まぁ、順序を追ってやったほうがいいと思うけどねぇ。
968デフォルトの名無しさん:2007/06/05(火) 06:46:45
>>967
本人が「ソース読んだ」といってもそこに書いてあること全部読みとった
とは仮定しない方がいいと思うよ。本人の書く内容から推す経験値からしても。
なぜGCの知識はRuby由来かというと推測だけどおそらくRHGの存在によるんじゃない。

本人さんには現在実装しているサブセットの仕様を整理してもらって、
Lispをよく知っている住人は次にそれをどう拡張・変更するのがいいかって
お題を示してあげればいいんじゃないかなあ。
969デフォルトの名無しさん:2007/06/05(火) 10:19:20
eclで(load "test.lsp")として、その中で(defun test () (...))しているとして、
(test)としても、The function test is undefined.になってしまいます。
なぜでしょうか?根本的に間違っていますか?
970948:2007/06/06(水) 00:36:25
>>958 は std::map<std::string, Symbol*>クラスじゃなくて
std::map<Symbol*, 値>クラスの間違いでした。
構文解析の Symbol を作成する時に使うのと間違えてました。

>>963
Symbol インスタンスはプールしていて同じ文字列の場合は
以前作成したのを返却するようにしています。

>>964
実はinternもよく分かっていないんですよね。
Rubyや.NETなら文字列の値に対して一意に決まる値って感じだと思ってましたが。

>>967
別に抵抗は無いですが、匿名でいたいかなぁとかなんとか。
あぷろだであげればいいのかしら。

>>968
その通りRHGで見よう見真似(というかコピペ)です。
あとぐぐって出てきたのを拾い読みしてる感じですかね。
971デフォルトの名無しさん:2007/06/06(水) 01:17:12
>>970
> std::map<Symbol*, 値>クラスの間違いでした。

心配したほど酷い処理系じゃなさそうだな。w
非標準だけどhash_mapあたりを使えば速くなるかも。
972デフォルトの名無しさん:2007/06/06(水) 07:45:44
>>969
Load に失敗してるんじゃないの?としか言えない。load を実行したときのメッセージと
test.lsp の中身を見せてみて。

ecl の実行時カレントパスと test.lsp の置き場所がずれててロードできてないとかじゃないか。

>>970
あぷろだでいいと思うよ。
973969:2007/06/06(水) 09:15:16
>>972
ありがとうございます。
eclからrdnzlのサンプルを呼び出しています。
下記のとおりになります:
D:\ecl\ecl\msvc>ecl2
ECL (Embeddable Common-Lisp) 0.9i
...中略
Type :h for Help. Top level.
>>> (load "rdnzl/load.lisp")
;;; Loading "D:/ecl/ecl/msvc/rdnzl/load.lisp"
...中略
;;; Loading "D:/ecl/ecl/msvc/rdnzl/direct.fas"
"D:/ecl/ecl/msvc/rdnzl/load.lisp"
> (load "rdnzl/examples/apropos.lisp")
;;; Loading "D:/ecl/ecl/msvc/rdnzl/examples/apropos.lisp"
"D:/ecl/ecl/msvc/rdnzl/examples/apropos.lisp"
> (run-apropos-form)
The function RUN-APROPOS-FORM is undefined.
Broken at EVAL.No restarts available.
Broken at EVAL.
974969:2007/06/06(水) 12:35:20
上記のecl2はECLのサイトのwiki→platform→WindowsXP内の記載に従い、
VC2005 Standard(Expressではなく)でビルドしたものになります。
rdnzlはサイト中にあるvc8対応の0.5ではなく、0.6.0を使用しています。
(一番最初のExamplesは動いたので)
975デフォルトの名無しさん:2007/06/06(水) 18:30:06
>>974
え〜っと、runさせる前にこれ実行してみたらどうだろう。
(in-package :rdnzl-user)

余談だけど0.9iはバグがあるのか、他のライブラリでも動かないことがあるね。
あと困ったことに、VC++は一つの配列で持てる文字列の大きさに制限があって、
eclで大きなファイルをコンパイルしようとすると、そのせいでコンパイル
できないことがある。ちゃんとコンパイルが通ったかは、注意した方がよさそう。
(gccにはそういった制限はなかったので、gccでコンパイルするって手もある)

VC++でそれを回避するには、compile-fileではなくて、compileで関数を
一つずつコンパイルすればいいのかもしれない。
976974:2007/06/06(水) 19:34:48
>>975
すばらしい!無事ロードし、実行できました。
(in-package :rdnzl-user)は、lispファイルの一番最初で実行されているので
不要かと思いました。

ご教示ありがとうございました。
977デフォルトの名無しさん:2007/06/06(水) 21:19:09
>>970
google の捨てあどとって google code とか
978948:2007/06/07(木) 02:04:55
とりあえず現状のをアプしてみました。
http://deaikei.biz/up/
の 5673.zip です。パスは lisp で。
まだデバッグコードが入りまくってます。
スタイルは C#(というかMS系?)でやってます。よろぴく
979デフォルトの名無しさん:2007/06/08(金) 23:23:19
拡張子cppだからC++なんだよね?
駄目もとでg++でコンパイルしたら、friend Hoge;はfriend class Hoge;でないとあかんやろーみたいなエラー出まくった。
後、std絡みのクラスの問題だと思うけど、例外系絡みぽいエラーが続発。
酔ってるので詳細はよくわからんし、調べもしてないけど。なんかデストラクタの宣言を指してエラーにされてる箇所もあった。
非MS系での報告ですまんが、万が一何かの役に立てば幸いですw
980デフォルトの名無しさん:2007/06/10(日) 17:25:49
C言語で言うtokenみたいなものってないんすか?
コマンドの解析をしたいんだけど
cmd=print
data=hello
これをcmdがprintで
表示のデータがhello
というように解析したいのですが
981デフォルトの名無しさん:2007/06/10(日) 20:19:37
(cmd "print")
(data "hello")
とか書いてもらって、readで済ますのがLisp流
982デフォルトの名無しさん:2007/06/10(日) 21:41:54
次スレを作っておきましたです。

【入門】Common Lisp その3【質問よろず】
http://pc11.2ch.net/test/read.cgi/tech/1181479267/l50
983デフォルトの名無しさん:2007/06/10(日) 21:45:51
>>982


このスレが3スレ目まで行くとは凄いな
984デフォルトの名無しさん:2007/06/12(火) 08:52:16
変数に関数を放りこんで、それを後から取り出して実行するのはどうするの?

(setf test #'(lambda () (format t "hello")))
(test)
みたいな感じのことをしたい.

gethashでデータと一緒に関数を入れておいて
maphashで取り出して実行みたいなことをしたい

なんか良く伝わってないかもしれないが、よろしくお願いします.
985デフォルトの名無しさん:2007/06/12(火) 09:38:00
>>984
(funcall test)
986デフォルトの名無しさん:2007/06/12(火) 22:07:59
このあたりダサいよね CL って。
987デフォルトの名無しさん:2007/06/12(火) 22:17:04
コンピュータ言語なんてもんは、実務でバリバリ使える効率性と柔軟性がありさえすれば、
ダサかろうが汚かろうが何の問題もありゃしません。
988デフォルトの名無しさん:2007/06/12(火) 22:23:08
>>987
その見解はlispには逆風だね
989デフォルトの名無しさん:2007/06/12(火) 22:27:18
そんな所で頑張る必要なんて無いじゃない
990デフォルトの名無しさん:2007/06/12(火) 22:28:37
>>986
スキマは巣へ
991デフォルトの名無しさん:2007/06/12(火) 22:54:28
>>990
lisperだお^^
992デフォルトの名無しさん:2007/06/12(火) 23:17:33
ここは CL スレだからいっとくが、funcall がダサいって決めつけるのはいくない。

名前空間がわかれてないせいで kons とか lis とかって変数名になるのはカコイイのか?
関数呼び出しが (((generator))) とかなるのがカコイイのか?
構文の括弧なのか関数呼び出しなのかは構造みないとわからないのがカコイイのか?
実際に何段階呼び出すのかは *括弧を数えないと* わからないのがスマートなのか? (CL なら funcall 数えればすむ)

まぁ、好みの問題なんだけどさ…。
993デフォルトの名無しさん:2007/06/13(水) 00:13:44
funcallを隠したければリードマクロなのかな?
994デフォルトの名無しさん:2007/06/13(水) 00:16:34
最近の関数型言語だって funcall なんて頭悪そうなの使っているのは無いよ
普通に呼べる
995デフォルトの名無しさん:2007/06/13(水) 00:17:30
>>994
頭悪そうだな
996デフォルトの名無しさん:2007/06/13(水) 00:20:12
cl でも lst 使うからまったく名前は被らないな
常に funcall 書かなきゃいけないのとたまに使うかも知れない関数と同名のシンボルとどっちを取った方がいいのか
cl のソースは funcall のせいで大分読みづらくなっていると思う
arc とかどうだったっけ?
997デフォルトの名無しさん:2007/06/13(水) 00:25:18
同じ (foo ...) だと、まず foo って名前の関数があったっけ、いやいやローカルスコープだ、って感じ
に思考が動くが funcall があると明示的で追いやすいという言い方もできる。
目くじらを立てるほど、どちらが良いとか、どちらがダサいとか言う問題ではないと思う。
なんか鬼の首でも取ったかのような>>986とその応援隊(?)が痛々しいよ。
998デフォルトの名無しさん:2007/06/13(水) 00:40:02
funcallあると追いやすいってどうしてよ
関数コールなんて見て一発で判るでしょ
逆にfuncallがあったほうが要素が多くなって追いにくくなるよ
前置記法なのにそこに関数がないんだから構造が変わってしまう
999992:2007/06/13(水) 00:42:58
なんでトレードオフがわからずに俺の気に入らない物をつかってるやつはバカみたいな極端に走るかねぇ。
俺の師匠とか、昔の Schemer はそんなじゃなかったけど、これも時代かねぇ。何にでもこれ一つでおっけーみたいな
ものや、最強のなんちゃらみたいなものを求めるというか。考えを固定したってあんま良い事ないと思うんだけど。
そんなに funcall が嫌なら隠せばいいでしょって事ね。

(defmacro with-suck-lisp1-style (functions &body body)
`(macrolet ,(mapcar (lambda (e) `(,e (&rest rest) `(funcall ,,e ,@rest))) functions)
,@body))

CL-USER> (setf f1 #'cons f2 (lambda (x y) (cons y x)))
...
CL-USER> (with-suck-lisp1-style (f1 f2) (f1 f1 (f2 nil f2)))
(#<SYSTEM-FUNCTION CONS> #<FUNCTION :LAMBDA (X Y) (CONS Y X)>)
1000デフォルトの名無しさん:2007/06/13(水) 00:48:58
>>998
> 関数コールなんて見て一発で判るでしょ

ここに意見の相違があるわけ。俺は「常に一発でわかるとは限らない」と考えている。たとえば ((foo) ...) というコード片を見たとき、
Scheme だとその構造の一個上 (cond ... ((foo) ...) まで見ないと、cond の節かどうかその断片だけじゃわかんない。
CL スタイルなら ((funcall foo) ...) と cond の条件節みたいな構造の括弧 ((foo) ...) は一目瞭然。
funcall があったらそれは構造をあらわす括弧じゃなくて関数呼び出しの式という事がわかる。
これはコードを読む時に意識する範囲を狭める手助けとなる。少なくとも俺はね。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。