Lisp Scheme Part23
..
159:デフォルトの名無しさん
08/08/12 02:12:45
>>151
マクロ機能は自分で好みのを書けってことだったんじゃないかな?
当時のマクロの実装は簡単だったしね。
160:デフォルトの名無しさん
08/08/12 02:42:42
>>149
私立だって簡単に聴講生になれるぞ。
金がかかるだけで。
161:デフォルトの名無しさん
08/08/12 02:47:46
>>159
最初の頃はFSUBR + EVALで一々手で書いた。
パターンが出来上がったのでdefmacroになった。
>>156
> 自習だとつまらないことでつまづいて長い時間考えることがあるからです。
本当はそれが大切なんだけどね。
より深く理解するし、それが出来る人が継続もできる。
壁に負ける人はいつも負け続ける。
162:デフォルトの名無しさん
08/08/12 02:56:09
それが大切だとしても若いうちだけだろ。
年取ってるなら金払ってでも学習速度を上げたいって言うのはわかる。
163:デフォルトの名無しさん
08/08/12 02:59:04
生涯学習だな。カルチャー教室でやらないかな?w
164:lischemep ◆/uyHCgG7qA
08/08/12 06:13:10
>>157
家庭教師。つまるところそうなのかもしれません。
Lisp/Schemeにとっつきにくさがあると思ってて
同じ状況の人がいるだろうと思ってたのですがあまりいないみたいですし。。。
状況としてはThe Little Schemerの半ばで頓挫している状況です。
他にもプログラミングGaucheやANSI Common Lispなどをつまみ食いしてますが
途中で分からなくなってます。
色々当たっているうちに少しずつ分かったりしますが
時間がかかりすぎている気がしています。
このままだと数年かけて一冊片付くペースになってしまいそうです。
>>162
三十代になるとさすがに焦ります。
165:デフォルトの名無しさん
08/08/12 08:01:59
> 三十代になるとさすがに焦ります。
俺は164がなんでLisp/Schemeをやってみようと思ったのかが気になるな。
知的興味が理由なら年齢で焦ることはないだろうし。
近い将来に仕事で使う必要があるのなら焦る気持ちもわかる。
学習する動機によっておすすめの方法も違ってくると思うんだが。どう?
166:デフォルトの名無しさん
08/08/12 09:03:44
書いてあるじゃん
挫折しそうだから
くじけそうだから
もう後がなさそうだから
167:デフォルトの名無しさん
08/08/12 09:45:28
俺なんて、40近くになってScheme始めたぞ。
独学でSICPをしこしこ解いてるよ。
同時に数学の勉強も始めたんだが、こっちがきつい。
数学基礎論のやさしい教科書はないかな。
168:デフォルトの名無しさん
08/08/12 10:56:25
目的がいまいちはっきりしない質問者はやがて身の上話を始める法則
>>167
> 同時に数学の勉強も始めたんだが、こっちがきつい。
> 数学基礎論のやさしい教科書はないかな。
数学基礎論の質問スレッド その4
スレリンク(math板)
おおかた数理論理学か集合論の教科書を薦められると思うが
計算機科学との関連で何かもくろみがあるならこっちへ
URLリンク(science6.2ch.net)
169:デフォルトの名無しさん
08/08/12 12:54:29
「数学」が何を指してるか知らんが、
基礎論は数学を勉強する支えにはならないぞ普通は。
集合論とか論理とかを学ぶなら基礎論には手を出していない
普通の教科書のほうが良い。
170:デフォルトの名無しさん
08/08/12 13:28:48
>>168
ありがとうございます。覗いてみます。
>>169
そうなんですか?
集合論とか論理学から、計算機科学方面へ進めていきたいと思っていたのですが。
私の「基礎論」という言葉の使い方がおかしいのでしょうか?
集合論や論理学そのものを学んだほうが良いということでしょうか?
171:デフォルトの名無しさん
08/08/12 18:36:29
>>146
仕様があればまともな言語なのぉ〜?
172:デフォルトの名無しさん
08/08/12 18:40:24
「まともな言語」の集合を定義してください
173:デフォルトの名無しさん
08/08/12 19:28:14
>>170
今、数学で「基礎論」といったら、逆数学とかあのへんのことを指すんじゃないかな。
少なくとも専門分野を「基礎論」と自己規定してる数学者は、だいたいそのあたりの
分野を研究してることが多い。(Harvey Friedman, Stephen Simpson, 田中一之氏, etc)
「基礎論」という分野が勃興してきた19世紀末と現在とでは、言葉のニュアンス
がかなり違ってきているので、注意が必要かと。
167氏はあるいはもっとルーズに、「基礎論」という言葉を「数理論理学」とほぼ同義で
使ってるのかもしれないが。
まあいずれにしろ、数理論理学は(少なくとも初歩の段階では)メインストリームの数学とは
直接関係しないことが多いね。幾何的モデル理論みたいに、数論への応用があったりする
分野もあることはあるけど、そういうのは非常に専門的な話題になってしまう。
(169氏が言ってる「数学を勉強する支えにはならない」というのはおそらくそういうニュアンスなのだろう。)
でも理論計算機科学に興味があるのなら、数理論理学は必須だから、(167氏言うところの)
「基礎論のやさしい教科書」を勉強するのは意味のあることだと思うよ。
とりあえずはこのあたりをご参考に。
URLリンク(www.kurims.kyoto-u.ac.jp)
174:デフォルトの名無しさん
08/08/12 20:05:34
計算機工学者のための計算機数学のとっかかりということなら、
島内さんの「数学の基礎」はどうかと思ったが、
URLリンク(www.amazon.co.jp)数学の基礎-島内-剛一/dp/4535601062
絶版で中古市場では高い!ヤフオクでも元より値が上がってる!
175:デフォルトの名無しさん
08/08/12 20:22:59
竹内外史とかのは基礎論だよな?
と板違いか。
176:lischemep ◆/uyHCgG7qA
08/08/13 06:23:48
>>165
はじめのきっかけは、「普通のやつらの上を行け」を学生時代に読んでです。
知的興味もありますが、将来的には仕事で使いたいと思っています。
また、なるべくLisp/Schemeを広めていきたいと思っています。
それで初学者向けの勉強会が出来ないかと思いました。
目標としては、AllegroServeを使えるようになること、
On Lispを理解できるようになることです。
177:デフォルトの名無しさん
08/08/13 07:40:49
>>176
まだ、shemeやcommon lispに馴れていないならば、SICPよりもう少し簡単なもの
からお勧めするよ。
schemerなら、gauche本でもいいし、common lisperならAnsi Common Lispや岩波
の本でもいいし。
178:デフォルトの名無しさん
08/08/13 11:16:10
>>176
ポールグレアムって結局SchemeにもCLにも否定的じゃないか?
179:デフォルトの名無しさん
08/08/13 14:30:39
>>178
どちらかといえばSchemeにもCLにも肯定的だと思うよ。
(Lisp族以外の言語に比べれば)
180:デフォルトの名無しさん
08/08/13 16:20:52
PG
javaには否定的というのははっきりしてるし、C系に苛立ちを持ってるような記述も
みかけたことはあるかな。
181:デフォルトの名無しさん
08/08/13 16:46:20
CとPerlは人気の言語として色々条件を満たしているみたいな話があったような
182:デフォルトの名無しさん
08/08/13 18:55:38
40年も前から存在するのに
lispが全く存在感無い事について
想像力を働かせてみた方がいいと思うね
183:デフォルトの名無しさん
08/08/13 20:29:28
>>182
どれだけの世界を見て生きてきたか知らんが、
あなたのちっぽけな経験で感じた存在感なんて
なんだというのだ
ふしあなか?
184:デフォルトの名無しさん
08/08/13 20:42:17
>>183
頑張ってそれか?
「viaweb以外のインストールベースの例を教えてください」
って聞かれたらどうするの?
はいやりなおし!
185:デフォルトの名無しさん
08/08/13 20:44:57
「実用性なんて飾りです。偉い人にはそれがわからんのですよ。」
くらい言わないと。
186:デフォルトの名無しさん
08/08/13 21:16:40
>「viaweb以外のインストールベースの例を教えてください」
なんか薄っぺらいなぁ。
187:デフォルトの名無しさん
08/08/13 21:37:39
>>170
皆言ってるように「数学基礎論」そのものに首を突っ込む必要はない。
集合というのはただのモノで、ただのモノについての議論を深めていくと
濃度がどうとか数学基礎論の方へ行く。
そっちではなくて数学の基礎と言うか数学村の言葉使いに慣れておく必要がある。
つまり集合と言うただのモノに必要な性格付けをして数学的な実質のある体系を
作っていく手順を自分なりに一度は体験しておく必要がある。
入り易いのは数の構成で、島内氏のとか岩波新書に「数の体系」とかいろいろある。
そんなことは分かってるというのであれば不要だが、単に実数も複素数も知ってるというのではだめ。
次にやっておくべきは代数かな。計算機科学との相性も良いし、暗号等での応用もあって本もたくさんある。
あとは必要と興味に応じてやっていけば良い。ひとつ注目したいのは圏(カテゴリー)論。
ひと昔前はGAN(GENERAL ABSTRACT NONSENSE)とか揶揄されたが様変わりで、
Haskellで圏論と言う言葉を知る人も増えたらしい。
188:デフォルトの名無しさん
08/08/13 22:43:56
昔の本だと「数学基礎論」となっていても
真偽関数から始めて命題論理・モデル理論・述語論理・帰納的関数・・・と続き
最後にちょこっと公理的集合論が出てくる、というような感じで
>>170のやりたそうなことに内容的にはちょうどよかったんじゃないかと思うが
今はもっと効率的にやる方法もあるだろう
189:デフォルトの名無しさん
08/08/14 00:16:28
>> 173, 187, 188
ご教示、ありがとうございます。
そもそもの動機なのですが、ただいま「論理と計算のしくみ」を読んでいまして、
ちょっと展開が速すぎて着いていけないので、もうすこし詳しく、さらに言えば
演習もあるような書籍は無いかと思ったしだいです。
証明の仕方に慣れていないせいか、結論はともかく過程に納得ができなくて。
とりあえず、「論理学をつくる」を入手しましたので、これをみっちりやってみます。
圏論も視野には入っています。ちょっと遠そうですが。
一番初めの目的はプログラミングや設計に役立てるためだったのですが、
いつのまにか、数学を学ぶこと自体が楽しくなってきてしまいました。
脱線して、計算機科学と関係ない方向に行ってしまいそうです。
190:デフォルトの名無しさん
08/08/14 00:18:15
>>184
はいさようなら!
191:176
08/08/14 08:39:29
177さん
助言ありがとうございます。
やっぱりLispかSchemeどっちを学ぶか決めた方がいいのでしょうか。今は両方手をつけてます。
それと最近翻訳された実践Common Lispは初学者向けですか?
192:デフォルトの名無しさん
08/08/14 09:00:16
>>191
そこは自分で考える部分だよ。
言語の取得って基本的に同時に複数をやるのはあまりよいとは思えないですね。
ゴールがなにか?を考えたら使用する言語は決まってくると思うけど。
LLな活動ならgauche で充分だけど、重い計算をさせるならcommon lispのほうが
当然向いてるし。
193:デフォルトの名無しさん
08/08/14 10:15:16
>>192
同時にやるのが〜といったのは
(defun foo (arg1 arg2) ....)
(define (foo arg1 arg2) ....)
と微妙な違いの1例だけど、この違いがなれないうちは混乱に結びつくからだよ。
(defun foo (arg1 arg2)
....
(cond
[(= a b) ...]
....))
みたいになっちゃいけないし。
194:デフォルトの名無しさん
08/08/14 10:18:31
>>193
それはcommon schemeだ。
195:デフォルトの名無しさん
08/08/14 17:48:19
>>191
『プログラミングGauche』で「途中で分からなくなって」るんだったら、
『実践CL』も同じ結果になる可能性が高いんじゃないかと。
とりあえず「AllegroServeを使えるようになる」という目標があるのなら、
CL一本に絞って、もっと懇切丁寧な初学者向け教科書で勉強してみるのが
一番じゃないでしょうか。
Peter Norvigもたしか「まったくの初心者にはこれが一番いい」と言ってたと
思いますが、TouretzkyのGentle Introductionが非常に丁寧でいいと思います。
こちらから全文が無料でダウンロードできます。
URLリンク(www.cs.cmu.edu)
196:デフォルトの名無しさん
08/08/14 20:27:19
「リスト遊び」とかどうだろう。Emacsが動けばすぐ試せるし。
197:デフォルトの名無しさん
08/08/14 21:32:19
「プログラミングGauche」は全部理解する必要はないだろう。
特に第3部は必要な箇所だけ読めば良い。
198:lischemep ◆/uyHCgG7qA
08/08/14 23:53:22
皆様、色々と助言ありがとうございます。
>>195さん、
よさそうですね。後で印刷して通勤の合間に読んでみます。
>>196
Emacs Lispの本も持ってます。そちらにも手を付けてみます。
>>197
それを聞いて少し安心しました。
199:デフォルトの名無しさん
08/08/15 00:10:04
AllegroServeを使えるようになるにしろ、On Lispを読めるようになるにしろ、
実践Common Lispは良いテキストだと思うけどなあ。
漏れは、リスト遊びや、Elispの勉強は、上二つの目的には直接関係してこないと思う。
200:デフォルトの名無しさん
08/08/15 07:36:30
>>199
禿同。実践本がマスターできたら、あとは自分で調べながら何でもやれるよ。
マクロもCLOSも書いてある本は他にないと思う。実践本のFOO言語の下りは
本当に素晴しい。
ちなみにAllegroServeは使うだけなら全然難しくないよ。
S式でややこしいListの構築の練習に良いかもね。
リスト遊びは名著だけど、泥臭くなさすぎる。
201:デフォルトの名無しさん
08/08/15 21:17:10
教えてください.R5RSに記述されている手続き/シンタックスはすべて
syntax, library syntax, procedure, library procedure, optional procedureのいずれかに
分類されていますが,define, define-syntax, syntax-rulesに関しては上の分類別の記述がありません.
どのように考えれば良いでしょうか.すべて定義に必要なものですから基本的なものだとは思うのですが
単純にsyntaxの部類に属するとしてよいのでしょうか.
202:デフォルトの名無しさん
08/08/15 22:01:12
define、define-syntaxは式ではないのでsyntaxではない
syntax-rulesは式ではないのでsyntaxではない
たぶん
203:デフォルトの名無しさん
08/08/15 22:15:19
CLで言う所の特別式は値のある式だけど
R5RSではたとえば
(define x (define y 100))
などは許されない
204:デフォルトの名無しさん
08/08/15 22:16:49
値のない式もあるから203の例は不適当だったか
205:デフォルトの名無しさん
08/08/15 22:59:38
>>201
define, define-syntax, syntax-rulesは確かに書いてないねえ。
でも、こいつらはどう考えても手続きじゃないから分類するならsyntaxなんじゃないの?
206:デフォルトの名無しさん
08/08/15 23:14:59
CLみたいに特別式、関数、マクロに単純に分類できないからねぇ
beginの扱いも微妙だし
207:デフォルトの名無しさん
08/08/21 16:12:21
svnから引っ張ってきた最新版のgaucheをVCでコンパイルすると
実行時にしょっぱなのScm_Initでこけます。
どうもvminsn.cの SCM_VM_LOCAL_ENV_CALL ラベルに来たとき
vm->val0に値が設定されていないことが原因っぽいのですが、
これの解決策分かる方いませんか?
スレチなら、適切な場所に誘導してもらえると嬉しいです。
208:デフォルトの名無しさん
08/08/21 16:17:07
>>207
> スレチなら、適切な場所に誘導してもらえると嬉しいです。
URLリンク(www.lingr.com)
209:デフォルトの名無しさん
08/08/21 16:21:22
>>201
自分はsyntaxだと理解してきました。
ちなみにR6RSではsyntaxと明記です。
210:デフォルトの名無しさん
08/08/21 16:32:12
>>208
ありがとうございます。
211:デフォルトの名無しさん
08/08/22 10:08:30
URLリンク(natu.txt-nifty.com)
センスのないネタやね。この手の奴にlispを語ってほしくないな。sicpを
やってた奴みたいだが。
212:デフォルトの名無しさん
08/08/22 11:21:48
どうでもいいものを、ここに張る奴もどうかしてる。
213:201
08/08/23 02:28:49
>>みなさま
いろいろお教えいただきましてありがとうございます
>>209 さんのご意見に従い
割り切ってsyntaxに入れてしまったのが簡単で良いかなと思っています
しかしこれらをあえてsyntaxから外してあるということは
R5RSはそれだけ厳密に定義されているということなんでしょうか
214:デフォルトの名無しさん
08/08/23 14:07:51
R5RSは結構いい加減w
それ系のMLでも解釈について議論になってる。
もちろん仕様がないような言語とは比較になりませんが。
どういう言語でも↓こういうことがあるもんなんです。
URLリンク(www.open-std.org)
そういうレベルの意味において「いい加減」
215:デフォルトの名無しさん
08/08/23 14:32:15
静的型と仕様は頭の中にあればいいよ
216:デフォルトの名無しさん
08/08/24 13:16:35
お前は頭の中で済むほど頭がいいのか?
217:デフォルトの名無しさん
08/08/24 13:41:23
お前は頭の中で済むと思い込むほど頭がわるい人は多い。
218:デフォルトの名無しさん
08/08/24 14:11:09
worse is betterを思い出した
頭のいい奴は複雑なものを作るから困る
219:デフォルトの名無しさん
08/08/24 14:17:34
日本語は難しくてかなわん
S式で説明してくれ
220:デフォルトの名無しさん
08/08/24 16:58:12
(define (難しい? 言語) (eq? 言語 '日本語))
(if (難しい? '日本語) 'S式でおk)
221:デフォルトの名無しさん
08/08/24 18:06:39
>>220
コラコラw
222:デフォルトの名無しさん
08/08/24 19:41:38
>>220
#<undef>
223:デフォルトの名無しさん
08/08/24 21:16:28
ところでSchemeの仕様にむやみと未定義が多いのは何でなの?
なにかに決めりゃいいじゃん、nil でもいいからさぁ。
とりあえず決めた方が実用的になると思うんだけど。
224:デフォルトの名無しさん
08/08/24 21:24:42
>>223
決めちゃったらもう変えれないだろ。
議論が尽くされてないところは決めるべきじゃないし、
実用のために不格好になるのは CommonLisp だけで十分。
225:デフォルトの名無しさん
08/08/24 21:53:41
common lispが不恰好とな?
226:デフォルトの名無しさん
08/08/24 22:26:38
少し認める
227:デフォルトの名無しさん
08/08/24 22:44:55
>>223
決めちゃうことが(例えば性能的な)制約になる実装があり得るから
228:デフォルトの名無しさん
08/08/25 00:15:13
rubyとか酷いよね
229:デフォルトの名無しさん
08/08/25 00:26:43
gauche上の話なのですが、
(definc-syntax member
(syntax-rules () ((_ name) (name :init-value 0))))
(define-class <test> ()
(member X))
こうすると、どうも(member X)の展開が上手くいかないようなのです。
これを上手く展開させる方法はありますか?
230:デフォルトの名無しさん
08/08/25 00:29:57
>>229
本質的にマクロをわかってない。
あくまでもそういう書き方で展開させたいなら結構めんどいことになるよ。
231:デフォルトの名無しさん
08/08/25 00:31:15
評価される場所でないと、マクロは展開されない。
define-class ごと再定義するのが良いだろう。
232:デフォルトの名無しさん
08/08/25 00:46:58
>>230-231
ありがとうございます。
他のやり方を考えてみます。
233:デフォルトの名無しさん
08/08/25 13:14:13
writeとかdisplayが真値を返さない可能性があるので
and-let*とかで処理をつなぐ時にいちいち
(begin (write obj) #t)とか書くのは不恰好な気がする。
せめて#<undef>は#fにはなりえない、くらいの制約は欲しい
(とはいえ、未規定の値を返す手続きが#fを(返す|返しうる)処理系は見たことないけど)
234:デフォルトの名無しさん
08/08/25 20:56:28
* が前置されていたら次の式は #t を返したものとして扱う、てな
自分用and-letを定義したらどうよ。
235:デフォルトの名無しさん
08/08/25 21:23:18
意味的に and じゃないとこで andなんちゃら を使っているのだから仕方ない
236:デフォルトの名無しさん
08/08/25 22:07:51
letをネストしたくないのと、いちいち継続を捕捉して脱出したくないだけだろ
戻り値が未定義だというのは問題の本質ではないな
237:デフォルトの名無しさん
08/08/25 22:13:41
朝起きたらLISPになっていますように
238:デフォルトの名無しさん
08/08/25 22:22:37
つまり括弧を書きたくないだけだね。
フロントエンドでも作れば?
239:デフォルトの名無しさん
08/08/25 22:43:16
HaskellのMaybeモナドっぽく使いたいわけですよ
いろいろマクロを書いて試してます
>>238
括弧を書きたくないのではなくて
beginで値を捨てるのが好きじゃないんです
未規定値は#fかもしれないし真値かもしれないというのも気持ちが悪いです
もしかしたら(eq? (write obj1) (write obj2)) -> #fかもしれませんし
240:デフォルトの名無しさん
08/08/25 23:00:06
個人的には、未規定値は使ったとたんにエラーになる処理系が好ましいな
241:デフォルトの名無しさん
08/08/25 23:34:49
0個の多値を返せばいいじゃない
242:デフォルトの名無しさん
08/08/25 23:54:07
and-let*の中で返り値が未規定な手続きを使ったり、
未規定値を比較する、といった発想が理解できない
243:デフォルトの名無しさん
08/08/25 23:57:40
他コンピュータとの通信プログラムなどで
画面出力するというのが主ですね
クライアントプログラムなどでREPLの介入が出来ない場合
デバッグのための出力を埋め込んだりもします
244:デフォルトの名無しさん
08/08/25 23:59:29
未規定値の比較は実際には行いませんよ
ただ真理値も同一性も規定されていないから
どうなるかはわからないといいたかっただけです
245:デフォルトの名無しさん
08/08/26 00:46:26
なぬ? (begin (write "hoge") #t) が恰好悪いですと?
そんな時こそマクロ〜
246:デフォルトの名無しさん
08/08/26 08:15:32
>>244
プログラミング向いてないのでは?
247:デフォルトの名無しさん
08/08/26 19:11:39
(define (tree-count elem tree)
(let f ((rest tree) (count 0))
(cond
((null? rest) count)
((list? (car rest)) (f (append (car rest) (cdr rest)) count))
(else (if (eq? elem (car rest))
(f (cdr rest) (+ 1 count))
(f (cdr rest) count))))))
(= 6 (tree-count '<> '(A B C <> (A <> (X <>)) <> (<> <>))) ; => #t
こういうのでも末尾再帰になってるんでしょうか?
248:デフォルトの名無しさん
08/08/26 20:17:38
fの呼出しは末尾呼出しになってますね
249:デフォルトの名無しさん
08/08/27 09:03:03
>>239
ほんとにMaybeモナドみたいにしたいなら、そのように書くしか無いと思うよ
(有効な値は全部Justでくるむとか、逆に「有効な返り値と決してeq?にならない
値」を失敗を表すのに使うとか)。and-let*で#fを特別扱いしてるのは
「大抵の場合うまくいく」っていう一種の妥協で、>>239のアプリは
その「大抵の場合」から外れているってことだと思う。
250:デフォルトの名無しさん
08/09/01 23:00:41
絶版になったと思ってたディヴィグ翻訳本
いつの間にかまた売られるようになってますね
3版ではなさそうですが
251:デフォルトの名無しさん
08/09/02 19:44:54
little schemerの継続の所が凄くわかり辛い(関数名からして意味不)
今の段階ではこういうのもあるって知っておく程度で詳細は他の本でカバーしろって事かな?
252:デフォルトの名無しさん
08/09/02 21:00:46
頑張れ、ここで派を食いしばれってこと。
ドリルみたいなもんだから、逃避したら身には付かない。
253:デフォルトの名無しさん
08/09/02 21:07:49
何の発見もない精神論だな
254:デフォルトの名無しさん
08/09/02 21:15:31
結局shiroさんの記事とwikipediaとprogramming language schemeを参考にしましたけどね
255:デフォルトの名無しさん
08/09/02 21:15:31
ドリルでルンルンクルルンルン
256:デフォルトの名無しさん
08/09/04 15:02:19
>>251
具体的にどのページのどれが分からないか書かないとまともなレスは来ないよ常考。
257:デフォルトの名無しさん
08/09/04 23:09:46
継続渡しのネタはP.137-147ですね
あとP.160ー173のYコンビネータのネタもややこしいですね
初見では10章よりも難しく思えましたまる
258:デフォルトの名無しさん
08/09/05 15:46:59
P.137の multirember&co の定義で2つコレクター出てくる。
ひとつは
(lambda (newlat seen)
(col newlat
(cons (car lat) seen)))
もうひとつは
(lambda (newlat seen)
(col (cons (car lat) newlat)
seen))
実は2つとも無名関数で再帰をしている。このコレクターが再帰のたびに別な関数になっていることをちゃんと理解できてるかな?
これが分かるならP.140までは理解できているはず。つまりTenth Commandmentはコレクターを作れってことだよね。実行してみるとこうなる。
URLリンク(codepad.org)
8章のテーマは確かに継続渡しなんだけど、無名関数で再帰することを上手にやるのがコレクターってこと。
9章のネタではさらに再帰のさせ方を工夫してやるとYコンビネータを作れるというお話。
P.137からP.140が理解できればコレクターとYコンビネータを両方とも理解できます。頑張れ。
259:デフォルトの名無しさん
08/09/05 16:08:06
Yコンビネータは memoization に役立つんだけど、それとコレクターは瓜二つで8章・9章のもとネタになっています。
260:デフォルトの名無しさん
08/09/05 16:28:25
>再帰のたびに別な関数になっていることをちゃんと
無名関数で新しい関数が作れることをマクロ内でやれるようになると、プログラムの記述量を物凄く減らすことができる。
SchemeなどのLisp系言語の特徴はプログラムの記述量が少ないこと。これを支えているのが8章・9章の考え方。
ここを理解できると「Lisp脳」の人たちの考え方に近づくことが出来ます。
261:デフォルトの名無しさん
08/09/05 16:45:03
Tenth Commandment・・・Lisp脳で問題を考え直せ
↓
・コレクターを使ってみる
・Yコンビネータを使ってみる
・マクロを使ってみる。
そういえばSchemerシリーズにはマクロの説明が無いね。Reasoned Schemerでは使ってるけど。
262:デフォルトの名無しさん
08/09/05 16:45:52
再帰というか自己参照ね。
それが無限の入れ子になったのが再帰。
263:デフォルトの名無しさん
08/09/05 17:00:17
>それが無限の入れ子になったのが再帰。
有限じゃないと処理が終了しない常考。
264:デフォルトの名無しさん
08/09/05 17:28:36
弱参照も張らずにメモ化とな
265:257
08/09/05 17:53:48
chapter8,9を理解できるのがいまのところの目標であることはわかりますた。
sicp読んでみたけど1.11の反復版の答え見て「なんだこれは」と実力不足は実感しましたし。
Yコンビネータのところは
URLリンク(www.ece.uc.edu)とか
URLリンク(dangermouse.brynmawr.edu)みながら読み返してます。
collectorについては
8章のmultirember&coは書き出したりしながら雰囲気は掴めたんだけど、最後のeven-only*&coの
一番ネストが浅いcondのelseのコレクターをどうするの?って言うところ(P.146の上から4段目)で
ボブロスばりに答えの(lambda (al ap as)...)ってのが出てくるのが、面喰らいました。
でこれはURLリンク(practical-scheme.net)の末尾再帰と継続って項で説明されてるような考え方を使って
ようやく「なるほど」って思える程度の理解に辿りついた次第であります。
マクロはTeach yourself scheme in fixnum days、Programming Language Schemeのマクロの項
あとOn Lispとpractice schemeのpractical-scheme.netのScheme:OnLispの項を参考にしてます。
elispを一年ぐらい触ってて()に抵抗が無いぐらいは馴染んでるつもりですが、それでもここまで詰まるとは…
やっぱり生のLispってものは怒ろしいものですね。
あとmultirember&coの"&"の読み方がわかったのも収穫です、ありがとう皆
266:デフォルトの名無しさん
08/09/05 17:59:08
弱参照(weak reference)の話を始めたらソフト参照もしなきゃならない。
ここではコレクターやYコンビネータの話をしてるのに。
メモ化(memoization)ですら話が遠くなるからあとにしてくれ。
267:デフォルトの名無しさん
08/09/05 18:00:05
そんな我が儘言われても・・・
268:デフォルトの名無しさん
08/09/05 18:22:31
multirember&co では lambda + collector は2つ使う。
multiinsertLR&co では lambda + collector は3つ使う。コレクターを1つ余計に使うだけ。
evens-only*&coでは lambda + collector は3つ使う。これは multiinsertLR&co と同じ。
multirember&co では a-friend の引数は2つ。
evens-only*&coでは the-last-friend の引数は3つ。コレクターの引数を1つ余計に使うだけ。
>一番ネストが浅いcondのelseのコレクターをどうするの?って言うところ(P.146の上から4段目)で
>ボブロスばりに答えの(lambda (al ap as)...)ってのが出てくるのが、面喰らいました。
そこで詰まるのはプログラミングの概念が原因じゃなくてP.145の3段目が頭に入ってなかっただけでしょ。
分かってるみたいだし気にしないで大丈夫。
269:デフォルトの名無しさん
08/09/05 18:30:38
>>267
オマエ、弱参照が話したいだけだろ。ぼくちゃん知ってるよーみたく。ガキだねw
270:デフォルトの名無しさん
08/09/05 18:34:21
ここはおまえが演説する場所ではない
271:デフォルトの名無しさん
08/09/05 18:40:39
>>270
オマエが弱参照を教えてやれば?
他の香具師は優しく>>257に教えてるぞ。
なんでけんか腰になるかね?
272:デフォルトの名無しさん
08/09/05 18:48:39
>>269 みたいなこと言ってるガキには喧嘩腰が適切
273:デフォルトの名無しさん
08/09/05 18:50:56
>>266
「あとにしてくれ」とか書いてる時点で「おまえの演説」だろ。
ここは私物ではない。
274:デフォルトの名無しさん
08/09/05 18:56:22
負け犬が暴れているようにしか見えないんだがw
275:デフォルトの名無しさん
08/09/05 19:05:47
雑音気にしないで演説続けろ
276:デフォルトの名無しさん
08/09/05 19:26:53
メモリリークの話はHaskellスレでもやってたね。メモ化じゃなくて遅延評価だけど。
277:デフォルトの名無しさん
08/09/05 19:40:48
LLFuture 動画リスト
URLリンク(www.nicovideo.jp)
278:デフォルトの名無しさん
08/09/05 21:44:50
evens-only* (P.144)
URLリンク(codepad.org)
((9 1 2 8) 3 10 ((9 9) 7 6) 2)
↓
((2 8) 10 (() 6) 2)
evens-only*&co (P.145-146)
URLリンク(codepad.org)
((9 1 2 8) 3 10 ((9 9) 7 6) 2)
↓
(38 1920 (2 8) 10 (() 6) 2)
リストの中にリストがある場合の処理がちょっと面倒でした。
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5380日前に更新/75 KB
担当:undef