- 1 名前:デフォルトの名無しさん [2005/05/12(木) 21:44:01 ]
- 過去スレ
Part1: piza2.2ch.net/tech/kako/987/987169286.html Part2: pc.2ch.net/tech/kako/1002/10025/1002584344.html Part3: pc.2ch.net/tech/kako/1008/10082/1008220265.html Part4: pc.2ch.net/tech/kako/1016/10162/1016211619.html Part5: pc3.2ch.net/tech/kako/1023/10230/1023091882.html Part6: pc3.2ch.net/tech/kako/1031/10315/1031560687.html Part7: pc5.2ch.net/tech/kako/1042/10421/1042167213.html Part8: pc5.2ch.net/tech/kako/1058/10582/1058263391.html Part9: pc2.2ch.net/test/read.cgi/tech/1069594582/ Part10: pc5.2ch.net/test/read.cgi/tech/1075630259/ Part11: pc5.2ch.net/test/read.cgi/tech/1091456033/ Part12: pc8.2ch.net/test/read.cgi/tech/1100229366/ 関連リンクは>>2-10あたり
- 83 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 09:29:09 ]
- 俺はこうかな
(define foo #f) (define bar #f) (let () (define hoge ...) (set! foo (lambda (...)...)) (set! bar (lambda (...)...)) ) でも、最適化が効きにくくて>>81より遅くなりそうだな...(考え中) >それならグローバルなハッシュテーブルに詰め込んでおく方が。 それってどんなやりかた?
- 84 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 11:15:02 ]
- えぇー、scm.libとかでやってる方法がデフォルトだと思ってた
- 85 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 11:20:08 ]
- (make-hash-table xxx-package)
(let (pi 3.141692) (define hoge ...) (hash-table-put! xxx-package 'foo (lambda (...) ...)) (hash-table-put! xxx-package 'bar (lambda (...) ...)) ) (define foo (hash-table-get xxx-package 'foo)) (define bar (hash-table-get xxx-package 'bar)) >>83 こんな感じ。実際こうやって使ったことないからちゃんと動くかわからないけど。 >>84 それはパッケージ管理?CommonLisp風のset!の提供の方?
- 86 名前:84 mailto:sage [2005/05/21(土) 11:40:44 ]
- >>85
パケージ管理の話してるんだろ、ここ?
- 87 名前:84 mailto:sage [2005/05/21(土) 11:57:22 ]
- slibの話のつもりだったんだけど・・・あれ?パッケージ管理してねぇや。。。スレ汚しすまそ
- 88 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 11:58:31 ]
- slibの話のつもりだったんだけど・・・あれ?パッケージ管理してるけど名前空間は分けてないや。。。スレ汚し^2すまそ
- 89 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 12:11:23 ]
- つまらんことで悩んでないで Common Lisp 使え
- 90 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 12:14:26 ]
- うぜ
- 91 名前:83 mailto:sage [2005/05/21(土) 15:17:48 ]
- >>85
なるほどそういう使い方があったのか THX! すると例えば (define-syntax define-package (syntax-rules (export) ((_ pkgname (export id ...) body ...) (begin (define pkgname (make-hash-table)) (let () body ... (hash-table-put! pkgname 'id id) ...) (define id (hash-table-get pkgname 'id)) ...)))) とやって (define-package foo-package (export foo bar) (define hoge 9) (define foo (lambda (x) (- x hoge))) (define bar (lambda (y) (+ y hoge)))) とすれば hoge => #unbound (foo 10) => 1 (bar 10) => 19 となるわけか。 実装に依存したくない時はいいかも!
- 92 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 16:11:17 ]
- hash-table自体が実装に依存する罠
まあ後付で作れるけどさ
- 93 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 03:54:25 ]
- すごく遅くてもいいならalist使えばいい。
- 94 名前:ミミ [2005/05/22(日) 19:28:26 ]
- Scheme でクラスを定義する場合、
メンバ変数の命名規則はどうしていますか? Java や C++ だと m_var とか _var とか var_ とかで 命名すると思いますが、Scheme でアンダースコアは あまり使われませんよね。
- 95 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 22:43:35 ]
- >>94
そうでもない。アンダースコアも普通に使うよ。
- 96 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 22:55:17 ]
- 入力したlistを整数倍してlistで返すにはどうすればいいんですか?(list 3 4) → (list 6 8) みたいな感じです。
consでかえるようにならできたんですが。
- 97 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 22:56:18 ]
- map
- 98 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 22:58:57 ]
- >>96
(map (lambda (elt) (* elt 2)) (list 3 4)) --> (6 8) ってことかな?
- 99 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 22:59:39 ]
- ((cut map * 2 <>) '(3 4))
=> (6 8) cut :: SRFI 26: Notation for Specializing Parameters without Currying
- 100 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 23:02:09 ]
- (map (lambda (n) (* n 2)) (list 3 4))
LISPなど全く知らない俺が適当に書いてみました
- 101 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 23:16:22 ]
- (define-syntax m-list
(syntax-rules () ((_) ()) ((_ dat ...) (list (* dat 2) ...)))) (m-list 3 4) --> (6 8)
- 102 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 23:23:36 ]
- (define-syntax rewrite-list
(syntax-rules (list) ((_ n (list dat ...)) (list 'list (* dat n) ...)))) (rewrite-list 2 (list 3 4)) --> (list 6 8)
- 103 名前:ミミ [2005/05/22(日) 23:28:13 ]
- >>95
クラスのメンバ変数をアンダースコアで命名していますか?
- 104 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 23:36:35 ]
- クラスのメンバ変数など存在しない
- 105 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 23:46:45 ]
- ハイフォンが使えるのにアンダースコア使う理由って何?
と、LISPなど全く知らない俺が適当に聞いてみる
- 106 名前:ミミ [2005/05/22(日) 23:50:28 ]
- >>104
どういうこと?
- 107 名前:デフォルトの名無しさん mailto:sage [2005/05/23(月) 00:03:56 ]
- >>105
単に単語の区切りの意味でハイフンは使うから区別したいんじゃね?
- 108 名前:デフォルトの名無しさん mailto:sage [2005/05/23(月) 00:08:48 ]
- >>107
わかるようなわからんような、実例プリーズ
- 109 名前:デフォルトの名無しさん mailto:sage [2005/05/23(月) 03:27:32 ]
- すみません。scheme というか lisp 初めたばかりなのですが、
list と cons の意味がわかりません。 (cons 1 2) と (list 1 2) はどう違うんでしょうか。 両方とも car と cdr の結果は同じですよね?
- 110 名前:デフォルトの名無しさん mailto:sage [2005/05/23(月) 03:36:08 ]
- >>109
car は同じだけど、 cdr は違うよ。 (car (cons 1 2)) 1 (cdr (cons 1 2)) 2 (car (list 1 2)) 1 (cdr (list 1 2)) (2)
- 111 名前:デフォルトの名無しさん mailto:sage [2005/05/23(月) 04:07:51 ]
- はい。
(cdr (list 1 2)) が (2) になるのはどういった理由かわからないのです…
- 112 名前:デフォルトの名無しさん mailto:sage [2005/05/23(月) 04:18:46 ]
- あぁ、pair と list の項目を読んでみたら、なんとなくわかった気がします。
スレよごし、スミマセン。
- 113 名前:デフォルトの名無しさん mailto:sage [2005/05/23(月) 08:34:12 ]
- >>112
cons は「core」で、list は「library」みたいな区別をしてみるのもいいかも. 「library」は「core」から導くことができるんだね. 例えば list は (lambda x x) と等価とかね ( もちろん lambda は「core」). 後になって、define-syntax とかでマクロを組むときに、きっと役に立つよ. 雑談スマソ
- 114 名前:デフォルトの名無しさん mailto:sage [2005/05/23(月) 09:25:14 ]
- わざわざオレ用語で説明せんでも。
- 115 名前:デフォルトの名無しさん mailto:sage [2005/05/23(月) 11:07:33 ]
- >>113
lambda は「library」でいいじゃん (define-syntax λ (syntax-rules () ((_ formals body1 body2 ...) (let-syntax ((dummy (syntax-rules () ((dummy) #f)))) (define (proc . formals) body1 body2 ...) proc))))
- 116 名前:3歳児 mailto:sage [2005/05/23(月) 11:13:33 ]
- たんなることばのもんだいだと思いまちた
- 117 名前:デフォルトの名無しさん mailto:sage [2005/05/23(月) 17:04:35 ]
- >>111
(cadr (list 1 2))が2になる、って言ったら解る? (car (cdr (list 1 2)))と同じ。 あと、(list 1 2)は(cons 1 (list 2))と同じ 図で描くと解りやすいけど、図入りの本は持ってないの?
- 118 名前:デフォルトの名無しさん mailto:sage [2005/05/23(月) 17:11:34 ]
- 最もプリミティブなのは点対だからね。
(a b c) ってのは (a . (b . (c . ()))) の略だということを思い出そう。
- 119 名前:3歳児 mailto:sage [2005/05/23(月) 17:15:23 ]
- このすれのれべる、がくっとさがりまちたねぇ
- 120 名前:デフォルトの名無しさん mailto:sage [2005/05/23(月) 17:28:09 ]
- >>114
R5RS読めば?
- 121 名前:デフォルトの名無しさん mailto:sage [2005/05/23(月) 18:09:23 ]
- R5RSの「primitive」のことを「core」なんて命名してるからオレ言語と
揶揄されてるんじゃないの?
- 122 名前:Scheme 初心者 mailto:sage [2005/05/23(月) 23:57:52 ]
- >>115
define は lambda を使って定義できると思うのですが・・・
- 123 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 00:08:48 ]
- >>122
つか (define (f args...) body...) って (define f (lambda (args...) body...) の省略形だから(ry
- 124 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 00:21:28 ]
- let も lambda で書ける
- 125 名前:112 mailto:sage [2005/05/24(火) 00:40:23 ]
- >>115 >>123
1変数関数の場合で、例えばフィボナッチ数列を 求める関数をdefineを使わないで定義したいときは、 (((lambda (f) ((lambda (p) (f (lambda (arg) ((p p) arg)))) (lambda (p) (f (lambda (arg) ((p p) arg)))))) (lambda (fib) (lambda (n) (if (<= n 1) 1 (+ (fib (- n 1)) (fib (- n 2))))))) 10) で定義できるから、lambdaがprimitiveでdefineはlibraryじゃないの? マジで初心者だから教えてよママン!
- 126 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 01:53:11 ]
- >>125
基本的には正しい。lambdaがあれば変数の束縛もできるからdefineの代用になる。
- 127 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 02:18:50 ]
- トップレベル以外はな
- 128 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 08:02:54 ]
- トップレベルもset!があればR5RS的には○。IEEE的には●でなかったっけ?
- 129 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 09:21:37 ]
- R5RSだと、define で割り当てされてないと set! はエラーじゃなかったっけ
- 130 名前:?デフォルトの名無しさん mailto:sage [2005/05/24(火) 11:52:15 ]
- R5RS 5.2.1 の最後の段落の日本語訳によれば
「Schemeの実装によっては、初期環境として、可能なあらゆる変数がなんらかの場所に束縛されており、そしてその場 所の大多数が未定義値を入れている、という環境を使う。このような実装ではトップ・レベル定義は代入と全く等価である。」 とあるんだけど.... これはそういう実装でもかまわないって意味なのかねぇ?
- 131 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 11:59:00 ]
- そういうこと。
- 132 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 16:24:30 ]
- 手元の処理系 (Gauche、Guile、PLT Scheme) では、未定義変数の参照、変更
はいずれもエラーになったな。>>130 からするとエラーにしなくてもかまわない みたいだけど、そういった処理系ある?
- 133 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 19:45:26 ]
- petite chezではエラーにならないようだ。
SCMもオプションでそうできた記憶があるけど未確認ですまぬ。
- 134 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 21:25:05 ]
- schemeのquasiquote書いてみました。これで合ってます?
(define-syntax qq (syntax-rules (quote quasiquote unquote unquote-splicing) ((qq x) (qq "in" 0 x)) ((qq "in" lv (quote x)) (list 'quote (qq "in" lv x))) ((qq "in" lv (quasiquote x)) (list 'quasiquote (qq "in" (1 . lv) x))) ((qq "in" 0 (unquote x)) x) ((qq "in" (1 . lv) (unquote x)) (list 'unquote (qq "in" lv x))) ((qq "in" 0 (unquote-splicing x)) x) ((qq "in" lv ((unquote-splicing x) . xs)) (append (qq "in" lv (unquote-splicing x)) (qq "in" lv xs))) ((qq "in" lv (x . xs)) (cons (qq "in" lv x) (qq "in" lv xs))) ((qq "in" lv #(x ...)) (list->vector (qq "in" lv (x ...)))) ((qq "in" lv x) (quote x))))
- 135 名前:デフォルトの名無しさん mailto:sage [2005/05/28(土) 00:57:22 ]
- LISP の歴史
community.computerhistory.org/scc/projects/LISP/ INTERLISP の絵が可愛い
- 136 名前:デフォルトの名無しさん mailto:sage [2005/05/28(土) 04:29:05 ]
- >>135
可愛いね。壁紙にしよう。
- 137 名前:デフォルトの名無しさん mailto:sage [2005/05/28(土) 09:20:32 ]
- すごく2chのAAっぽいんだが。
- 138 名前:デフォルトの名無しさん mailto:sage [2005/05/28(土) 09:24:53 ]
- >>137
2chのやりすぎ(w
- 139 名前:デフォルトの名無しさん mailto:sage [2005/05/28(土) 15:42:08 ]
- >>136
壁紙には風太くんの写真だよ。
- 140 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 01:33:40 ]
- やった、LISP をものにしたぞ!
- 141 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 03:57:12 ]
- >>140
悟れた?
- 142 名前:デフォルトの名無しさん mailto:age [2005/05/30(月) 09:14:27 ]
- Windows/VC++版のGauche-0.8.3w-03公開記念age
- 143 名前:デフォルトの名無しさん [2005/05/30(月) 22:20:33 ]
- あはは、やっとWindowsで動かないと糞だってことが透過したか
その調子でCMUCLのWindowsポーティングも頼むよ
- 144 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 22:32:25 ]
- >>143
取り敢えず、ここら辺りから頑張ってみれ。 www.caddr.com/macho/archives/sbcl-devel/2004-7/3690.html
- 145 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 22:36:20 ]
- 15年位前の記憶だけど、
CMUCLはKCLと違って、 RISC CPU (SPARC)専用にチューニングされてるから Intelには移植しにくそう・・・つう風評を聞いたな。
- 146 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 22:39:08 ]
- こっちの方が良かったかな。
ttp://www.dridus.com/~nyef/sbcl-on-win32.png 一年もあれば何とかなるんじゃなかろうか。
- 147 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 22:44:37 ]
- いまどき、CMUCL移植までして動かすアプリって何なんだろ?
当時は 制約ベースのGUIツールキットとか、音楽関係で動かしたいアプリがあったような記憶があるけど。
- 148 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 22:47:00 ]
- >>146
もしかして、シグウィン上で動かしているの? 折れ、cygwin嫌いなんだよな。 昔、ノーパソに入れたら恐ろしく遅かったから。。 多分、日本語も今市だし。
- 149 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 22:48:13 ]
- いや、君が嫌いだろうと好きだろうと、俺は別に構わんが。
- 150 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 23:06:14 ]
- >>145
今でも CMUCL のメインのメンテナは SPARC 使いだね。 メインのプラットフォームは x86 と言って間違いないと思うけど。
- 151 名前:145 mailto:sage [2005/05/30(月) 23:07:54 ]
- >>144
なるほど。 SPARCベッタリのCMUCLとは別に、 移植性の高いCMUCLクローンを Pythonベースのクロスコンパイラを種に ブートストラップ方式で作る、つうプロジェクトっすか。 CMU CL:カーネギー氏とメロン氏が鉄鋼業で貯めたお金で作った大学のCommon Lisp SB CL: 例の 鉄でガッポリ儲けた所が作ったのとよく似たCommon Lisp っすか。なんじゃこのネーミングセンスはw
- 152 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 23:14:49 ]
- >>150 ・・・今じゃx86で動くんですか。DOS Extender時代(pre Linux時代)とは隔世の感だなぁ
- 153 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 23:22:13 ]
- ずいぶん前にSchemeのContinuationの実装方法をここで議論した事があったんだけど、
議論と思ってたのは俺だけ、実はお相手は随分なプロヘッショナルな方だったのね。 某所でプロが揃い踏みしてるの見て、ちょっとビビってしまった(いやいや俺もプロだし・・・何のプロだろう?
- 154 名前:Schemer mailto:sage [2005/05/30(月) 23:22:18 ]
- Lisper からみたら Schemer ってどうみえるのでしょうか?
自分の中では、 Lisp = 松下(統制されている)またはブリーフ(チソポが窮屈) Scheme = ホンダ (自由にしてる)またはトランクス(チソポがフリー) という感じがする。
- 155 名前:153 mailto:sage [2005/05/30(月) 23:22:52 ]
- あらら、一瞬にしてレベルが低下してるし
- 156 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 23:31:50 ]
- Lisp遣い・・・・・・数式処理や並列計算、専用ハード設計、あと駅スパートシステムとかWebアプリのプロヘッショナル
Scheme遣い・・・実物見た事ないっす。厳選された奇妙な形のブロックでお城を建てる哲学者?
- 157 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 23:32:28 ]
- >>151
鉄はカーネギーで、メロンは銀行だよ。だからスチール(鉄)バンク(銀行)。 最近は SBCL の方が UNICODE やネイティブスレッドの採用など、CMUCL よりも使い易くなってると思います。移植性も良いし。 SPARC は tagged arithmetic があるから Lisp コンパイラを作り易いという 話だけど、ユーザーベースから言ったらやっぱり x86 な訳で、開発者にも Linux 使いが多い感じ。あと、意外にも Mac ユーザが多いっぽいね。
- 158 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 23:35:49 ]
- >>157
すまそ、Steel Bank Common Lisp Developper MLの一通目を斜め読みするのがやっとで、 バンクをなんとなく無視してますた。 > SPARCは tagged arithmetic そうそうw SUN のSPARC関連論文漁ってると、SPARCは最初からLispのサポートを視野に入れていたとか見た。 ・・・Java CPUは一体どうなったんだろう(w
- 159 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 23:37:05 ]
- >>154
Schemer: "Buddha is small, clean, and serious." Lispnik: "Buddha is big, has hairy armpits, and laughs." Nikodemus 氏のシグニチャだけど、名言だね。
- 160 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 23:41:22 ]
- >>158
ググると、Lucid Common Lisp の為に用意されたって記述があるけど 真偽の程はどうでしょう。 Lucid の社長さんって Sun に居た気がしたけど、今どうしてるのかな。
- 161 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 23:53:24 ]
- >>159
綺麗でかわいいブッダと、 腋毛ボウボウの豪傑ブッダかよ! 科学では、少ない原則でより多くの事柄を説明できる理論を採用する。 すると、Schemeが示そうとしているScienceは一体なんなんだろう。。。 >>160 Lucid 社長・・・わかんない。名前は聞いた事あるけど。 最近、Lisperの臭いをくんくん嗅ぎ分けながら業界のたくってるんだけど、 Frantz社長の名前くらいしか聞かなかった。あとは元Symbolicsで今は紺猿の人とか。
- 162 名前:デフォルトの名無しさん mailto:sage [2005/05/31(火) 00:06:15 ]
- 閑話休題
- 163 名前:デフォルトの名無しさん mailto:sage [2005/05/31(火) 00:42:03 ]
- Lucid は今の LispWorks じゃないかな。
以前評価したときは Allegro より高速だった(on x86)けど、日本ではマイナーかな。
- 164 名前:デフォルトの名無しさん mailto:sage [2005/05/31(火) 07:51:23 ]
- tagged arithmeticって、何?
- 165 名前:デフォルトの名無しさん [2005/05/31(火) 07:57:43 ]
- 6月19日-22日に開催されるInternational Lisp Conference 2005のスピーカーリストには、
Richard Gabriel, Sun Labs (Menlo Park, CA) って書いてある。現在も、Sunにいるらしい。 www.international-lisp-conference.org/speakers.html
- 166 名前:デフォルトの名無しさん mailto:sage [2005/05/31(火) 13:01:32 ]
- >>164
32bit wordの下位2ビットをタグとして扱うことができる。
- 167 名前:flatline@Vim%Chalice ◆r6EONKKhcc mailto:sage [2005/05/31(火) 18:24:40 ]
- サイト移転しますた
ttp://user.ecc.u-tokyo.ac.jp/~t50473/
- 168 名前:flatline@Vim%Chalice ◆r6EONKKhcc mailto:sage [2005/05/31(火) 18:24:55 ]
- サイト移転しますた
ttp://user.ecc.u-tokyo.ac.jp/~t50473/
- 169 名前:デフォルトの名無しさん mailto:sage [2005/05/31(火) 18:38:51 ]
- ・・・確かに「lispは25歳以下のスポーツ」と呼ばれるだけの事があるなw
- 170 名前:デフォルトの名無しさん mailto:sage [2005/05/31(火) 20:01:18 ]
- >>169 それはつらいなあ.私はヘキサでもギリギリだ.
- 171 名前:デフォルトの名無しさん mailto:sage [2005/05/31(火) 21:56:57 ]
- i.loveruby.net/ja/misc/ycombinator.html
上のページの Y-Combinator を,練習を兼ねて Common Lisp に移植してみました. (setf (symbol-function 'Y) #'(lambda (f) ((lambda (proc) (funcall f #'(lambda (arg) (funcall (funcall proc proc) arg)))) #'(lambda (proc) (funcall f #'(lambda (arg) (funcall (funcall proc proc) arg))))))) (setf (symbol-function 'fact0) #'(lambda (f) #'(lambda (n) (if (zerop n) 1 (* n (funcall f (- n 1))))))) (funcall (Y #'fact0) 5) => 120 ...やっぱり大変だ,これ.もっといい書き方はないものでしょうか.
- 172 名前:デフォルトの名無しさん mailto:sage [2005/05/31(火) 22:52:36 ]
- (setf (symbol-function ... はムリムリ感が強いなあ。
(defvar Y (lambda (f) ((lambda (proc) (funcall f (lambda (arg) (funcall (funcall proc proc) arg)))) (lambda (proc) (funcall f (lambda (arg) (funcall (funcall proc proc) arg))))))) (defvar fact0 (lambda (f) (lambda (n) (if (zerop n) 1 (* n (funcall f (- n 1))))))) (funcall (funcall Y fact0) 5) => 120
- 173 名前:デフォルトの名無しさん mailto:sage [2005/05/31(火) 23:07:36 ]
- >>172 なるほど,無理に関数側にセットするより,funcall を使う前提で変数
側にセットした方が,かえって自然ですね. しかし,funcall が林立するのは,どうしようもないのかなあ.
- 174 名前:デフォルトの名無しさん mailto:sage [2005/05/31(火) 23:13:58 ]
- evalが林立するよりはイイw
- 175 名前:デフォルトの名無しさん mailto:sage [2005/06/01(水) 00:34:04 ]
- Gauche 0.8.4 キタ━━━━(゚∀゚)━━━━ッ!!
- 176 名前:デフォルトの名無しさん mailto:sage [2005/06/01(水) 03:35:54 ]
- >>159
さしずめ Scheme 屋は三論の学僧で Lisp 屋は禅坊主ってところっすか。 仲が悪くてもしかたないな。 >>173 確かに関数をぐるぐる渡していくとなると面倒ですよね。 CPS とかでちょっと書いてみる位でも結構うんざりしたり。 #`(f ...) -> (funcall f ...) とかなリーダマクロでも書いてみるとか。あんま変わらないか。
- 177 名前:デフォルトの名無しさん mailto:sage [2005/06/01(水) 11:10:12 ]
- 私は Scheme から入ったのだけど,他の Lisp の良さも知りたいなあ.
Schemer と Common Lisper は仲が悪いみたいだけど,どちらも Lisp 文化の 主要な担い手なのだから.Scheme の方が短いコードでその優秀性を示しやす いのか,こういう場では Scheme のよさが目立ちがちな気がする.だけど, Common Lisp の優秀性もぜひお教えいただきたいものです. 自分の知っている例だと,かの「グリーンスパンの第10法則」のグリーンスパ ン氏の blog から philip.greenspun.com/bboard/q-and-a-fetch-msg?msg_id=0006XQ 「Common Lisp はロバストで効率的.Scheme ではハイパワーマシンでもこな せなかった処理を,Common Lisp だと非力なマシンでも成し遂げることができ た」 こんな感じで,自分の知っている言語の良さを出し合っていけたらなあ,と思 うのです.Scheme や Common Lisp や,スレ違いだけど Emacs Lisp までも. (Y-Combinator を Emacs Lisp に移植しようとして,動かない原因がしばら くわからなかったのは秘密.気が付いてみたら当たり前.動的スコープだから クロージャにならないのだもの...絶対に無理)
- 178 名前:デフォルトの名無しさん mailto:sage [2005/06/01(水) 12:52:55 ]
- ところで,Common Lisp で,末尾再帰の最適化をやってくれる処理系って,ど
んなものがあるでしょうか?xyzzy がバージョンアップしたみたいなので,試 してみたのだけど,やっぱりスタック数40,000 程度でオーバーフロー. (defun tail-rec (x y) (if (<= x 0) y (tail-rec (- x 1) (+ y 1)))) (tail-rec 40000 0) => オーバーフロー Petite Chez Scheme だったら 100,000,000 でも軽々動くのに.こういうのは 再帰にせず,堂々と loop で書くのが Common Lisp 的なのだろうか. (define (tail-rec x y) (if (<= x 0) y (tail-rec (1- x) (1+ y))) (tail-rec 100000000 0) => 100000000
- 179 名前:デフォルトの名無しさん [2005/06/01(水) 13:04:24 ]
- >>178
Allegro CLは大丈夫だったよ。
- 180 名前:デフォルトの名無しさん mailto:sage [2005/06/01(水) 13:06:37 ]
- >>178
> ところで,Common Lisp で,末尾再帰の最適化をやってくれる処理系って,ど > んなものがあるでしょうか? インタプリタではほとんどの処理系がやってない。 コンパイラではほとんどの処理系がやっている。
- 181 名前:デフォルトの名無しさん mailto:sage [2005/06/01(水) 13:10:37 ]
- clispもcmuslも大丈夫じゃない?
xyzzyのことはわからないけど、一般的にソースの頭に (optimize speed) と書いておくと末尾再帰をループ扱いしてくれるとか。 速度も上がるだろうしメモリも定量で済むはず。
- 182 名前:デフォルトの名無しさん mailto:sage [2005/06/01(水) 13:58:05 ]
- >>178
CLispで試してみた。>>180氏の言うとおりだった。 [1]> (defun tail-rec (x y) (if (<= x 0) y (tail-rec (- x 1) (+ y 1)))) TAIL-REC [2]> (tail-rec 40000 0) *** - Program stack overflow. RESET [3]> (compile 'tail-rec) TAIL-REC ; NIL ; NIL [4]> (tail-rec 40000 0) 40000 [5]> (tail-rec 10000000 0) 10000000
- 183 名前:デフォルトの名無しさん mailto:sage [2005/06/01(水) 14:52:06 ]
- >>182
ディスアセンブルしてみませう。
|

|