[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 04/21 19:13 / Filesize : 249 KB / Number-of Response : 867
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【入門】Common Lisp その3【質問よろず】



1 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 21:41:07 ]
lispを触ってみたい入門者のQ&A
初心者のQ&A
本スレでは恥ずかしくて聞けない人のQ&A
本スレは高度すぎて割り込めない人のQ&A
linuxでなくてwindowsでやりたいんですが・・・Q&A
lispを使用してC#やJAVAの代替にするための方法(おまけ)

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

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

(list
(url pc8.2ch.net/test/read.cgi/tech/1101386936/l50 :part 1)
(url pc11.2ch.net/test/read.so/tech/1140012484/l50 :part 2))


263 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 01:57:06 ]
ループの話題で思い出したけど、
最新版のSBCLで以下のコードがn=5000程度で死ぬんですが、
末尾再帰の最適化はしてくれないんでしょうか?
(defun w(n)
(labels ((x (n) (write n) (if (> n 0) (y (- n 1)) ))
(y (n) (write n) (if (> n 0) (z (- n 1)) ))
(z (n) (write n) (if (> n 0) (x (- n 1)) )))
(x n)))
(w 5000) ;程度で死ぬ

schemeでは
(define (w n)
(letrec ((x (lambda (n) (write n) (if (> n 0) (y (- n 1)))))
(y (lambda (n) (write n) (if (> n 0) (z (- n 1)))))
(z (lambda (n) (write n) (if (> n 0) (x (- n 1))))))
(x n)))
(w 10000000000) ;nをいくら大きくしてもOK

264 名前:デフォルトの名無しさん [2007/07/15(日) 02:46:34 ]
>>258
3 章までとか言われてもよくわかんないけど、princ くらいはあるのかな?
考え方:
0. リストがわたってくる
1. [ を表示
2. 各要素を表示
2-1. 要素がもうないなら終わり
2-2. 要素を一個表示して 2. へ
3. ] を表示

(defun show-list (lst)
(princ "[") ; 1
(show-list-contents lst) ; 2
(princ "]")) ; 3

(defun show-list-contents (lst)
(cond ((null lst) ; 2-1
nil)
(t ; 2-2
(princ (car lst))
(show-list-contents (cdr lst)))))


265 名前:264 mailto:sage [2007/07/15(日) 02:48:28 ]
264 のリスト内のリストも [] で表示するのは課題としときます。
ヒント: 要素がリストなのかアトムなのかを判定して…

>>260
while の内部実装が do でキモいというなら↓でどうでしょう。
(loop while (consp exp) do ....)
これも嫌なら素直に Scheme を使ったほうがいいと思います。

>>263
SBCL 1.0.7 で disassemble して末尾再帰の最適化もされている事を確認しました。
(w 10000000000) も普通に動いてるようですが。

266 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 03:24:34 ]
>>263
ごめんWindows版だから1.0.6だった。
普通にインストーラで作成されるショートカットから起動して
>>263のコードをコピペ。
(w 10000)で

12840283928fatal error encountered in SBCL pid 2812:
GC invariant lost, file "gencgc.c", line 832

LDB monitor
ldb>
となって止まる。
今確認したら5000だとなんか完了したりもするので10000で。
6000辺りだとプロンプト'*'が連続表示して暴走した風になって、
タスクマネージャで見るとメモリをどんどん消費していくのが判る。
ほっとくとOS側(XP Pro. SP2)でメモリ不足のダイアログが出る。
Windows版特有なのかな・・?

267 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 03:25:23 ]
ごめん上は>>265宛て

268 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 03:28:54 ]
* (disassemble 'w)してみたけど、最適化掛かってるかわからないので
よければ鑑定お願いします。

; 0A626C8E: 8B45F0 MOV EAX, [EBP-16] ; no-arg-parsing e
ntry point
; C91: 8945F4 MOV [EBP-12], EAX
; C94: E9FB000000 JMP L14
; C99: L0: 8BDC MOV EBX, ESP
; C9B: 83EC0C SUB ESP, 12
; C9E: 8B55F4 MOV EDX, [EBP-12]
; CA1: 8B05586C620A MOV EAX, [#xA626C58] ; #<FDEFINITION object for WRITE>
; CA7: B904000000 MOV ECX, 4
; CAC: 896BFC MOV [EBX-4], EBP
; CAF: 8BEB MOV EBP, EBX
; CB1: FF5005 CALL DWORD PTR [EAX+5]
; CB4: 7302 JNB L1
; CB6: 8BE3 MOV ESP, EBX
; CB8: L1: 8B55F4 MOV EDX, [EBP-12]
; CBB: 31FF XOR EDI, EDI
; CBD: E84E979DF7 CALL #x2000410 ; GENERIC->


269 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 03:29:59 ]
; CC2: 7302 JNB L2
; CC4: 8BE3 MOV ESP, EBX
; CC6: L2: 81FA0B001002 CMP EDX, 34603019
; CCC: 750F JNE L4
; CCE: BA0B001002 MOV EDX, 34603019
; CD3: L3: 8D65F8 LEA ESP, [EBP-8]
; CD6: F8 CLC
; CD7: 8B6DFC MOV EBP, [EBP-4]
; CDA: C20400 RET 4
; CDD: L4: 8B55F4 MOV EDX, [EBP-12]
; CE0: BF04000000 MOV EDI, 4
; CE5: E848959DF7 CALL #x2000232 ; GENERIC--
; CEA: 7302 JNB L5
; CEC: 8BE3 MOV ESP, EBX
; CEE: L5: 8955F4 MOV [EBP-12], EDX
; CF1: 8BDC MOV EBX, ESP
; CF3: 83EC0C SUB ESP, 12
; CF6: 8B55F4 MOV EDX, [EBP-12]
; CF9: 8B05586C620A MOV EAX, [#xA626C58] ; #<FDEFINITION object for WRITE>
; CFF: B904000000 MOV ECX, 4
; D04: 896BFC MOV [EBX-4], EBP
; D07: 8BEB MOV EBP, EBX
; D09: FF5005 CALL DWORD PTR [EAX+5]


270 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 03:31:13 ]
; D0C: 7302 JNB L6
; D0E: 8BE3 MOV ESP, EBX
; D10: L6: 8B55F4 MOV EDX, [EBP-12]
; D13: 31FF XOR EDI, EDI
; D15: E8F6969DF7 CALL #x2000410 ; GENERIC->
; D1A: 7302 JNB L7
; D1C: 8BE3 MOV ESP, EBX
; D1E: L7: 81FA0B001002 CMP EDX, 34603019
; D24: 7507 JNE L8
; D26: BA0B001002 MOV EDX, 34603019
; D2B: EBA6 JMP L3
; D2D: L8: 8B55F4 MOV EDX, [EBP-12]
; D30: BF04000000 MOV EDI, 4
; D35: E8F8949DF7 CALL #x2000232 ; GENERIC--
; D3A: 7302 JNB L9
; D3C: 8BE3 MOV ESP, EBX
; D3E: L9: 8955F4 MOV [EBP-12], EDX
; D41: 8BDC MOV EBX, ESP
; D43: 83EC0C SUB ESP, 12
; D46: 8B55F4 MOV EDX, [EBP-12]
; D49: 8B05586C620A MOV EAX, [#xA626C58] ; #<FDEFINITION object for WRITE>
; D4F: B904000000 MOV ECX, 4
; D54: 896BFC MOV [EBX-4], EBP
; D57: 8BEB MOV EBP, EBX
; D59: FF5005 CALL DWORD PTR [EAX+5]


271 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 03:32:07 ]
; D5C: 7302 JNB L10
; D5E: 8BE3 MOV ESP, EBX
; D60: L10: 8B55F4 MOV EDX, [EBP-12]
; D63: 31FF XOR EDI, EDI
; D65: E8A6969DF7 CALL #x2000410 ; GENERIC->
; D6A: 7302 JNB L11
; D6C: 8BE3 MOV ESP, EBX
; D6E: L11: 81FA0B001002 CMP EDX, 34603019
; D74: 750A JNE L12
; D76: BA0B001002 MOV EDX, 34603019
; D7B: E953FFFFFF JMP L3
; D80: L12: 8B55F4 MOV EDX, [EBP-12]
; D83: BF04000000 MOV EDI, 4
; D88: E8A5949DF7 CALL #x2000232 ; GENERIC--
; D8D: 7302 JNB L13
; D8F: 8BE3 MOV ESP, EBX
; D91: L13: 8955F4 MOV [EBP-12], EDX
; D94: L14: E900FFFFFF JMP L0
; D99: 90 NOP
; D9A: 90 NOP
; D9B: 90 NOP
; D9C: 90 NOP
; D9D: 90 NOP
; D9E: 90 NOP
; D9F: 90 NOP
; DA0: CC0A BREAK 10 ; error trap
; DA2: 02 BYTE #X02
; DA3: 18 BYTE #X18 ; INVALID-ARG-COUNT-ERROR
; DA4: 4D BYTE #X4D ; ECX
;
NIL



272 名前:265 mailto:sage [2007/07/15(日) 04:08:49 ]
>>266
あーそゆことか。コードはちゃんと最適化されてるが GC 回りのバグですね。
SBCL の Windows 版はまだ試験的なものなんで安定してないんだよ。
Windows な開発者も少ないしね。ごめんね SBCL にかわってごめんね

273 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 04:44:16 ]
うーむ、GC周りのバグってことは、ちゃんとプロテクトされてない
ってことかな?結構いい加減ですね・・。

ちなみにclisp(clisp-2.41-win32-mingw-without-readline.zip)で
同じ様にcompileして実行しても、
*** - Program stack overflow. RESET
と出るんですけど、こっちは何とかなりませんかね。


274 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 08:15:12 ]
俺も初心者ですが、こんなので合ってますか。

(defun show-list (lst)
  (cond
    ((atom lst)
     (format t "~A" lst))
    (t
      (format t "[")
      (show-list (car lst))
      (show-rest (cdr lst)))))

(defun show-rest (lst)
  (cond
    ((null lst)
     (format t "]"))
    ((atom lst)
     (format t " . ~A]" lst))
    (t
      (format t " ")
      (show-list (car lst))
      (show-rest (cdr lst)))))

275 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 12:19:07 ]
>>273
clisp について、(declare (optimize (speed 3))) とかしたらどうでしょうか。
www.lispworks.com/documentation/HyperSpec/Body/d_optimi.htm

今手元に環境がないんでちょっとあれでなにですが。

276 名前:265 mailto:sage [2007/07/15(日) 13:03:18 ]
>>273
うーむ、experimental と明示されてる Windows 版をつかって、そゆこというのは
味付け前の料理をつまみ食いして「味が薄い!!」とシェフにクレームつけるようなもんだよ。
安定してる Linux/BSD プラットフォームでは動いてるし。原因も、そのメッセージだけじゃ
GC そのものかコンパイラの出力かは情報不足だしね。

>>275
ちょっとソースみてみたけど、CLISP のオプティマイザはそのケースを最適化しない。
選択肢としては商用のコンパイラを使うとか、スタイルを換えるとか…まぁ、素直に Scheme 使うといいと思います。


277 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 13:42:14 ]
>>275
(defun w(n)
(declare (optimize (speed 3)))
(labels ((x (n) (write n) (if (> n 0) (y (- n 1)) ))
(y (n) (write n) (if (> n 0) (z (- n 1)) ))
(z (n) (write n) (if (> n 0) (x (- n 1)) )))
(x n))) としても
*** - Program stack overflow. RESET
は変わりませんでした。((optimize (space 3))等も試しました。)
(compile 'w)や、(compile-file "w.lisp")(load "w.fas")も同じ。
ソース中やdoc\impnotes.htmlにdeclare 〜 speed
が見つからなかったので、対応してないのかな。

ちなみに
sbcl-1.0.7/src/runtime/gencgc.c:832 を見ると
gc_assert(alloc_region->start_addr == (page_address(first_page) + page_table[first_page].bytes_used));
で停止。ちょっと見ただけでは修正は無理そうです。
そもそも10000程度のループでgcが必要になるってのが、
よくわからない。本当に最適化が効いてるのか怪しいです。

例えば自作のscheme処理系では360セル程しか消費してないです。
その内 式'(w 10000)のコンパイル時に必要になるのがほとんどで、
式そのものを実行する準備に6セル、(w 10000)実行中は消費量ゼロです。

278 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 14:25:37 ]
よくわからない→これま末尾再帰の最適化が効いていないに違いない、ね…
SBCL 使ったことねーけど cons セルの消費は write のI/O 周りとか boxing だろ?

正直、末尾再帰に納得しても #' とか健全マクロとかで「〜は○○できないんですか?僕の自作 Scheme なら…」
とか無限ループになりそうなのであなたは Scheme 使っていたほうがいいと思います。

279 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 14:55:31 ]
(defun x (n) (write n) (if (> n 0) (y (- n 1)) ))
(defun y (n) (write n) (if (> n 0) (z (- n 1)) ))
(defun z (n) (write n) (if (> n 0) (x (- n 1)) ))
(x 10000)
(defun w(n)
(labels ((x (n) (write n) (if (> n 0) (x (- n 1)) )))
(x n)))
(x 10000)
(defun x(n) (write n) (if (> n 0) (x (- n 1)) ))
(x 10000)
どのパターンもおかしくなるみたいです。

というか今更気付いたんですが、
(gc)を単体実行しただけで戻ってこない場合がありました。
これはちょっと使えるというレベルではありませんね・・。

>>276
すいません。Winで使うことしか頭になかったので。
仕事で使えるかなと淡い期待を持ってたんですが、、
速さこそ正義なCLの思想は好きなんですが、
今までどうにも環境に恵まれないです。
cmuclが動く*NIXな仕事に着きたいなあ・・

280 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 15:23:56 ]
>>278
そうですね。確認したらwriteが馬鹿食いしてるみたいです。
nがfixnum範囲ならばOKな様です。

今回は代表的なCL処理系でも末尾再帰スタイルが
実用上無理な物があると確認できただけでも収穫でした。
まあ心配されなくともschemeに戻るでしょう。

281 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 16:00:04 ]
すげぇ結論だな。ふつうは開発中のものは実用に耐えないっすね、となりそうなもんだが。まぁ煽りたかっただけなんだろなぁ…



282 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 16:04:13 ]
結論ありきですから

283 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 16:57:09 ]
>>281
clispのことでは
事実をただの煽りとして受け取った時点で
これ以上何も言うつもりはないけどさ

284 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 16:59:07 ]
lisp脳の他にschemerには再帰脳の恐怖もあるよな…

285 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 17:02:28 ]
やっぱloopの話題になると荒れるね

286 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 17:19:40 ]
主要な処理系てclisp のことなのかよ。じゃあ sbcI については誤解はとけたのね。商用も大丈夫だし、わさわざ出来ない環境さがしてんのかとオモタョ ゴメンネ


287 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 18:58:55 ]
scheme最強

288 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 19:00:19 ]
>>287
氏ね

289 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 21:06:04 ]
いい加減にSchemeはゴミだって認めようよ。

290 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 21:36:36 ]
CLerから出てくる語彙が精一杯考えて氏ねとかゴミなのはよくわかったよ

291 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 21:38:55 ]
スルー推奨



292 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 23:28:14 ]
Schemeは子供用のおもちゃみたいなもの

293 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 23:30:13 ]
>>290
巣へお帰りください
pc11.2ch.net/test/read.cgi/tech/1177065699/

294 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 23:40:38 ]
RHELユーザが 「plan9はアプリが少ない」 って言ってるようなもの

295 名前:デフォルトの名無しさん [2007/07/16(月) 21:01:29 ]
質問です。
2つのリストを、それぞれシンボルの集合とみなして、
左のリストと右のリストが一致するかどうかを判定し、
一致するなら右のリスト中のシンボルのそれぞれの
左に対応する位置インデックスを得たいのですが、
一個一個線形探索するより効率の良い方法はあるでしょうか?

(set-compare-pos '(a b c) '(b c a))
=>(0 2 1) ; 一致したのでそれぞれの位置インデックスを返す
(set-compare-pos '(a b c) '(b c a d))
=>nil ; 一致しない

296 名前:デフォルトの名無しさん [2007/07/16(月) 21:07:04 ]
ごめんなさい間違えました。
(set-compare-pos '(a b c) '(b c a))
=>(2 0 1) ; 一致したのでそれぞれの位置インデックスを返す 。
これの意味は、
左の集合のaは、右の集合の2番目にある
左の集合のbは、右の集合の0番目にある
左の集合のcは、右の集合の1番目にある
です。

297 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 22:19:15 ]
>>295
ハッシュテーブル使えば線形時間でできるんじゃないかな

298 名前:297 mailto:sage [2007/07/16(月) 22:27:48 ]
重複がある可能性は考えてないけどこんなもんかな。
集合が一致してなきゃいけないってとこでややこしくなった。

(defun set-compare-pos (s1 s2)
  (let ((table (make-hash-table :test 'eq)))
    (dolist (x s1)
      (setf (gethash x table) nil))
    (do ((c 0 (1+ c))
         (s s2 (cdr s)))
        ((null s))
      (if (cadr (multiple-value-list (gethash (car s) table)))
          (setf (gethash (car s) table) c)
        (return-from set-compare-pos nil)))
    (mapcar (lambda (x) (or (gethash x table)
                            (return-from set-compare-pos nil)))
            s1)))

299 名前:デフォルトの名無しさん [2007/07/16(月) 22:57:19 ]
ごめんなさい重複は無い物と考えてくださって結構です。
よって、一致する条件では左右の集合は同じ長さになります。
hashテーブルの存在忘れてました!
ありがとうございます。

300 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 00:26:34 ]
300ゲットー
>>274
良さそうだ。ま、実質同じだけど、ちょっと手抜きで関数一個で書けばこんなかな。
(defun fn (s)
(if (atom s)
(format t " ~a" s)
(progn (format t "[")
(fn (car s))
(mapcar #'fn (cdr s))
(format t "]"))))


301 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 01:41:21 ]
>>300
(fn '(a . b)) が失敗しちゃうよ。




302 名前:300 mailto:sage [2007/07/17(火) 21:01:51 ]
>>301
見落としてました……出なおしてきますorz

303 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 22:34:36 ]
>>98と同じ質問なのですが

CommonLispでCGIを書きたいのですが、
requireすると標準出力にダラダラと出力されてしまって
(何かコンパイルとかシステムをロードうんぬんみたいなメッセージ)
CGIなのでそれがHTML画面に表示されてしまいます。どうすべきでしょうか?

CGI自体はshで、

sbcl --noinform --load hoge.fasl

としています。

eval-whenとかを使えばよいのではないかと思いついて、
(eval-when (:compile-toplevel) (require ...))
とか、試してみたんですが、エラーになってしまう模様。
:load-toplevelでは意味ないですよね??load時にrequireしたら結局出力が出てしまう・・・

どうすべきなんでしょうか?そもそもeval-whenは関係ない?

304 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 23:00:28 ]
何回か出ているが、SBCL で CGI というのはオススメできない。
FastCGI にするか、mod_lisp をつかうか、huchentoot をつかうか、
ソケット経由でリクエストを SBCL プロセスに投げる CGI を C で書くとか
いろいろやりかたはあるけど、SBCL そのものを CGI として呼び出すのはやめとけ。
無理矢理強行しても Java で CGI とか Rails/CGI みたいな悲しいパフォーマンスになる。

305 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 23:04:50 ]
で、 require のメッセージを出したくない場合は、必要なものを全部 require した状態で
(save-lisp-and-die "hoge.core") としてイメージを生成して起動時に
sbcl --core hoge.core --noinform --load ... とかする。
しつこいかもしれないが、SBCL そのものを CGI として呼び出すのはやめとけよ。
スケーラビリティからインタラクティブなプログラミングのメリット台無しまであらゆる意味でオススメできない。

306 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 00:29:12 ]
一般論として、いまどき CGI というもの自体あまりお勧めではない

307 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 02:50:20 ]
じゃあ何よ

308 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 04:18:14 ]
あ・・・あじゃ・・・・


(↓ここで「アジャコング」とか書こうと思ったけどやるせなさ過ぎて止める奴)

309 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 05:32:01 ]
アジャコンゲ

310 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 07:32:57 ]
つaserve
sbclでちゃんと動くかは知らないけど。

311 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 18:27:27 ]
ここで満を持して kahua 登場! うわなにをs



312 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 22:17:54 ]
何もシネーよ

313 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 22:53:41 ]
Kahua って 304 のいう
> ソケット経由でリクエストを SBCL プロセスに投げる CGI を C で書くとか
に相当するのかな?


314 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 03:03:43 ]
しない

315 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 18:44:26 ]
ずいぶん前に、Windows版のsbclで日本語(sjis)が使えるようになったって
うわさを聞いたのですが、今使おうとしてもエラーが出ます。
うわさはデマだったのでしょうか?

316 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 18:46:41 ]
心のきれいな人にしか使えないんです

317 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 19:16:56 ]
そういうこと

318 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 19:31:30 ]
>>315
死ね

319 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 01:20:00 ]
>>318
こういうひとには使えません

320 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 23:04:55 0]
(setf *trans-code*
'(("add" . #'(lambda () (format t "add")))
  ("sub" . #'(lambda () (format t "sub")))
  ("mul" . #'(lambda () (format t "mul")))
  ("xor" . #'(lambda () (format t "xor")))))

(setf x (cdr (assoc "add" *trans-code*
:test #'string=)))

(funcall x)

こうすると"add"と表示されることを期待したのですが,
FUNCALL: #1=#'(LAMBDA NIL (FORMAT T "add")) is not a function name; try using a symbol instead
[Condition of type SIMPLE-TYPE-ERROR]
となってしまいます.これは何がおかしいのでしょうか?


321 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 23:26:53 0]
>>320
#' が ' の中にあるのでクォーティングされてしまっておるのだね。
`(("add" . ,#'(lambda ...
みたくするべし。



322 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 12:22:00 ]
>>321
ありがとうございました.追加で質問したいのですが,
なぜ>>320のコードではうまくいかないのか良くわかっておりません.
できれば解説などを加えていただければ...おねがいします.

323 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 20:52:26 ]
>>322
replで一行づつ打ちこめば自明じゃないか?

324 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 20:55:40 ]
>>322
(print x) して両者を比べてみよう
CLISP だったらこうなる

#'(LAMBDA NIL (FORMAT T "add"))
#<FUNCTION :LAMBDA NIL (FORMAT T "add")>

ちょっとわかりにくいかもしれないけど上は
(FUNCTION (LAMBDA NIL (FORMAT T "add")))
というリストで、下はクロージャ。

325 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 21:33:37 ]
>>322
#' とか ' とかってのは省略系にすぎないことを思い出そう。
あとは自分が read や eval になった気分でよく考えてみよう。

326 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 00:04:11 ]
            ∩_
           〈〈〈 ヽ
          〈⊃  }
   ∩___∩  |   |
   | ノ      ヽ !   !
  /  ●   ● |  /
  |    ( _●_)  ミ/ <こいつ最高にアホ
 彡、   |∪|  /
/ __  ヽノ /
(___)   /

327 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 00:33:32 ]
とは言っても俺ほどじゃないと思うけどな

328 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 00:47:14 ]
CommonLispでGUI作るときってどういう風にしてるの?

329 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 00:51:28 ]
GUIなんかいらねーよ

330 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 01:13:00 ]
>>328
CLX が最強

331 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 08:11:15 ]
なんか荒れまくってるなぁ。 >>328 商用の処理系は GUI ライブラリがついてくる。Allegro や LispWorks には GUI ビルダーも附属してるね。
フリーの処理系は Tcl/Tk とか Win32 API とか CLX とか OpenGL とか SDL みたいな低レベル API でがんばる。





332 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 11:28:52 ]
どこもかしこも夏の香りが漂ってるな

333 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 11:46:33 ]
フリーの処理系はffiがぶっ壊れてるから使い物にならんよ

334 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 11:46:52 ]
>>328
OpenMCL なら Cocoa が使えたと思う

335 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 12:03:04 ]
>>333
ドザ乙

336 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 16:51:37 ]
>>333
フリーの処理系はソースあるんだから自分で直せばいいじゃん

337 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 01:02:14 ]
おまいらありがとう。
>Tcl/Tk とか Win32 API とか CLX
>OpenMCLならCocoa
この辺は分かるけど
>OpenGL とか SDL
この辺になると自前でウィジェット作るの?

338 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 03:20:31 ]
探せばいろいろあるらしいぜ。探してない俺にはわからんが。

339 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 09:37:29 ]
そういえば McCLIM の事を忘れてた。
一応、標準 GUI ライブラリになる事を狙ってたんだよね。

340 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 17:49:10 ]
{x=a} begin y=x; x:=x+y end{x=2a} を証明せよ。

341 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 22:23:54 ]
ワッハッハwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww



342 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 14:40:26 ]
LispのGCの様子をヴィジュアルに見せてくれるツールとか
そういうものってないのですか?
自分のプログラムでGCがどんな風に動いてるのか見てみたいのですが...

343 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 16:04:15 ]
大昔の話だが、中西先生のAPPLE LISPは見えたな。APPLE IIのエミュレータで動かんかな?w

344 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:20:21 ]
>>315
うわさだかデマだかを流した張本人です。
どんな環境でどのようなエラーが出るのでしょうか。
最近 2ch はあまり見てないので、sbcl-devel@ か、英語が苦手なら俺宛に
メールを貰えるとありがたいです。

>>316-317 >>319
以前手元でテストした時はちゃんと使えたので、心がきれいでなくても平気だと
思います。

345 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:29:32 ]
心の汚い俺でも安心だな

346 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 02:52:20 ]
>>342
和田先生はGCルーチンをデバッグするとき、
printf()を使うところまでは一般人同様なのだが、
それで出力するのは実はPostScriptで、
consセルが増えたり減ったりする様子を
ビジュアルに把握しながらデバッグしてた、という話を聞いたことがある。

347 名前:315 mailto:sage [2007/08/04(土) 02:54:56 ]
>>344
WindowsXP sp2でバージョンは1.0.6のインストーラー版です。
症状は、コンソール上で実行したときには
* (print "あ")

"あ"
"あ"
*
と日本語が使えるのに、(print "あ")とだけ書いてあるmain.lispを用意して、
"C:\Program Files\Steel Bank Common Lisp\1.0.6\sbcl.exe" --load main.lisp
とすると、
This is SBCL 1.0.6, an implementation of ANSI Common Lisp.
More information about SBCL is available at <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.

This is experimental prerelease support for the Windows platform: use
at your own risk. "Your Kitten of Death awaits!"

348 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 02:55:49 ]
debugger invoked on a SIMPLE-ERROR:
Error during processing of --eval option (LOAD #P"main.lisp"):

can't happen
This is probably a bug in SBCL itself. (Alternatively, SBCL might have been
corrupted by bad user code, e.g. by an undefined Lisp operation like
(FMAKUNBOUND 'COMPILE), or by stray pointers from alien code or from unsafe
Lisp code; or there might be a bug in the OS or hardware that SBCL is running
on.) If it seems to be a bug in SBCL itself, the maintainers would like to
know about it. Bug reports are welcome on the SBCL mailing lists, which you
can find at <sbcl.sourceforge.net/>.

Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
0: [CONTINUE] Ignore and continue with next --eval option.
1: [ABORT ] Skip rest of --eval options.
2: Skip to toplevel READ/EVAL/PRINT loop.
3: [QUIT ] Quit SBCL (calling #'QUIT, killing the process).

((LAMBDA (SB-IMPL::E)) #<SB-INT:BUG {A60A9D9}>)
0]
となる、というものです。
>英語が苦手なら俺宛にメールを貰えるとありがたいです。
メールしようにもアドレスが分かりません。

349 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 10:45:16 ]
>>347
1.0.8 では直ってます。
Windows 版は
> This is experimental prerelease support for the Windows platform: use
> at your own risk. "Your Kitten of Death awaits!"
とあるように、まだ試験版なので、配布されてるバイナリは bootstrap 用
くらいに考えておいてください。

350 名前:デフォルトの名無しさん [2007/08/04(土) 21:05:27 ]
なぁ、>>1のパワーズって誰だ??

351 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 01:26:01 ]
>>346
かっこいい



352 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 06:57:04 ]
CLOS の良い日本語解説書ってないかな?
bit別冊 Common Lisp オブジェクトシステム -- CLOSとその周辺
というのがいいらしいのだが、絶版で
ttp://www.fukkan.com/fk/VoteDetail?no=20616
あと、1 桁のところで、復刊リクエストまで行ってないんだ…orz


353 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 08:48:30 ]
また懐かしい本だな…。今時売れねーんじゃねーか?
仕組はブラックボックスのままな HowTo 本は売れる世の中で、
メソッド探索のアルゴリズムだの実装まで触れてるような本が売れるとは思えん。
学生時代に読んで、いきなり「CLOS ではカプセル化なんてどうでもいいんですよ」的な出だしで
カルチャーショックを受けた経験あり。

354 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:01:04 ]
>>352
俺はもう投票済みだわ
あと6人!

355 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:53:20 ]
>>353
個人的には実装まで触れてるというのは、
単なる HowTo なんかよりよほど役立つと思うが、
CLOS 自体の需要が微妙だよな。
Ruby の Matz も推薦とか書けば、Ruby の勢いに乗って売れないか?
売れないか…


356 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 22:11:48 ]
ところでCLOSってなんて読むの?
今まで「くろす」って読んでたんだけど昨日のLLだと「しーろす」って言ってる人がいた。

357 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 22:25:49 ]
>>356
どっちでもいい、と件の本には書いてあったよ。

358 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 22:35:07 ]
>>355
www.rubyist.net/~matz/20060227.html#p02

359 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 22:38:00 ]
>>356
俺も「しーろす」と読んでるよ。
今まで誰とも CLOS の話をした事が無いから勝手読みだけど。

360 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 23:30:07 ]
CLOSはシーロスだと思う。
対話によるCommon Lisp入門という本の
第12話 オブジェクト指向プログラミングのはじめに、
「データ抽象の話を押し進めて行くとオブジェクト指向プログラミング
という現代的で実用性の高いプログラミング手法となります。
Common LispにはCommon Lisp Object System(CLOS,シーロス)
という機能が有り,Lisp流のオブジェクト指向プログラミングを可能にしています」
と書いてあるから。

361 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 23:43:55 ]
ttp://www.amazon.co.jp/dp/4274128598/
これが小さくて読みやすかったので
良いと思ったんだけど
同意された事が無い



362 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 00:17:05 ]
クロスじゃない?
C−LOS って感じに言葉が別れていないし
シーロスじゃどう考えても変だ
つーかどこかでクロスって注釈振ってある本読んだことあるぞ

363 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 00:17:56 ]
どう考えても変だとは思わない






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<249KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef