Lisp Scheme Part19
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/01/14(月) 00:14:56Part18: ttp://pc11.2ch.net/test/read.cgi/tech/1186922295/
Part17: ttp://pc11.2ch.net/test/read.cgi/tech/1177065699/
Part16: ttp://pc11.2ch.net/test/read.cgi/tech/1172404795/
Part15: ttp://pc10.2ch.net/test/read.cgi/tech/1151025773/
Part14: ttp://pc8.2ch.net/test/read.cgi/tech/1132275726/
Part13: ttp://pc8.2ch.net/test/read.cgi/tech/1115901841/
Part12: ttp://pc8.2ch.net/test/read.cgi/tech/1100229366/
Part11: ttp://pc5.2ch.net/test/read.cgi/tech/1091456033/
Part10: ttp://pc5.2ch.net/test/read.cgi/tech/1075630259/
Part9: ttp://pc2.2ch.net/test/read.cgi/tech/1069594582/
Part8: ttp://pc5.2ch.net/tech/kako/1058/10582/1058263391.html
Part7: ttp://pc5.2ch.net/tech/kako/1042/10421/1042167213.html
Part6: ttp://pc3.2ch.net/tech/kako/1031/10315/1031560687.html
Part5: ttp://pc3.2ch.net/tech/kako/1023/10230/1023091882.html
Part4: ttp://pc.2ch.net/tech/kako/1016/10162/1016211619.html
Part3: ttp://pc.2ch.net/tech/kako/1008/10082/1008220265.html
Part2: ttp://pc.2ch.net/tech/kako/1002/10025/1002584344.html
Part1: ttp://piza2.2ch.net/tech/kako/987/987169286.html
0951デフォルトの名無しさん
2008/03/08(土) 12:07:510952811
2008/03/08(土) 14:39:52wilikiをそのままコピーしただけではgettextがうまく機能しないと思います。
(メッセージが英語のままだったりしませんか?)
そのへんを>>811,845では小細工して解決してるんですが、微妙にきれいな方法ではないです。
localeがへんなところにインストールされているのはそのためです。
今のGaucheではWindowsではgauche.configモジュールがちゃんと機能しないので、
何かと不便な感じではあります。
gauche-config.cをそのまま拡張モジュールとして使えるようにできればいいんですけどね。
0953デフォルトの名無しさん
2008/03/08(土) 18:17:360954デフォルトの名無しさん
2008/03/08(土) 18:28:440955デフォルトの名無しさん
2008/03/08(土) 18:34:150956841
2008/03/08(土) 23:02:07うん、たしかに英語のままだった。
shareの下に置いてgettextさせて読み込ませるのには一応成功した。
だけどoperaやfirefoxだとwiliki見ることが出来ないんだよね。
なんかまだ設定がおかしいのかな?
俺が使ってるAnhttpdが悪いのかもしれんが。
0957811(齊藤) ◆3.JjF77I26
2008/03/08(土) 23:54:23Windowsでは改行の問題がある。
詳しいことはここに書いてある。
http://practical-scheme.net/wiliki/wiliki.cgi?Gauche%3aWishList#H-qawvzn
www.cgiモジュールをちょっと書き換えてあるので、
そこもコピーしてくれれば大丈夫だと思う。
0958841
2008/03/09(日) 00:22:08情報THXです。
0959デフォルトの名無しさん
2008/03/09(日) 00:31:12システム運用中にダイナミックにクラス定義を変更できる言語って
何がある?
# スレチだったら適当にルーティングしてほしい
0960デフォルトの名無しさん
2008/03/09(日) 00:40:44Scheme系のオブジェクト指向システム
その他はくだ質スレで。
0961デフォルトの名無しさん
2008/03/09(日) 00:42:11クラス定義の履歴を持つシステムをLispで開発していたような。
クラス定義だけじゃなくて、オブジェクトやスタックの履歴も全部w
0962デフォルトの名無しさん
2008/03/09(日) 01:33:50まぁ俺は何もしてないけど。
0963デフォルトの名無しさん
2008/03/09(日) 06:19:14ttp://user.ecc.u-tokyo.ac.jp/~tt076524/onlispjhtml/
0964デフォルトの名無しさん
2008/03/09(日) 10:36:20つttp://pc11.2ch.net/test/read.cgi/tech/1205021786/
0965デフォルトの名無しさん
2008/03/09(日) 15:14:15P153 下から4段目以降ですが何を云わんとしているのか分かりません。
Q.
Is there something else that changes about...(省略)
align関数への引数と再帰の使用に関して、変更するものは
他に何かありますか?
A.
Yes, there is ...(省略)
はい、あります。二番目の要素はより複雑になるが、
ペアの一番目の要素はもっと簡単になる。
Q.In what way ...(省略)
どういう方法を使えば一番目の要素は簡単になりますか?
A.It is only a part ...(省略)
元のペアの一番目の要素の一部を切り出すことによって。
(日本語が変ですが、P103 Sevens Commandment に従うという意味だと思います)
Q.Doesn't this mean ...(省略)
引数の長さを決定するlength*関数が間違っていることを意味
しませんか?(→意味不明)よりよい関数を見つけられますか?
A.あります。その関数は一番目の要素にもっと注意を払わなければいけない。
Q. How much ...(省略)
一番目の要素にどのくらい注意すべきですか?
A. At least twice as much
少なくとも二倍以上。(→意味不明)
この後weight*という新しい関数が紹介されますが意図がわかりません。
このくだりは、align関数がpartial functionかどうかを判断
するために存在しているはずですが、weight*関数導入後は最終的に
partial functionではないと結論づけられています。
みなさん、どのように理解されましたか?
0966デフォルトの名無しさん
2008/03/09(日) 20:15:040967デフォルトの名無しさん
2008/03/09(日) 20:18:40読んでるけど、書くほどのことがないんだよ。
0968デフォルトの名無しさん
2008/03/09(日) 20:25:25疑問に思うほどのことじゃないということですか?
length*とweight*のくだりはどう理解すればいいんですか?
0969デフォルトの名無しさん
2008/03/09(日) 22:29:120970デフォルトの名無しさん
2008/03/09(日) 23:18:23The seventh commandmentは、手続き型言語のループカウンターのように、再帰関数では何かを減らして逝くことでしょ。
>引数の長さを決定するlength*関数が間違っていることを意味 しませんか?(→意味不明)
それ誤訳。『length*関数が間違っているわけじゃないですよね?もっといい関数があるんですか?』という意味。
>元のペアの一番目の要素の一部を切り出すことによって。
>(日本語が変ですが、P103 Sevens Commandment に従うという意味だと思います)
これがThe seventh commandmentの言うようにgoalに向かって何かが減るように変更すること。このsimplerにする例がP.154のweight*。
>A. At least twice as much
>少なくとも二倍以上。(→意味不明)
P154のweight*をよく見ると、(× weight* (first pora)) 2)、というのがあって2倍している。
ネタばればけど、このように再帰関数では何かを減らして逝くことで計算がどこかで止まるようにする(The seventh commandment)。
そうでないものはPartial function。
The seventh commandmentの内容を突き詰めていくとP172のYコンビネータに行き着く。(コンビネータでのループ結合子)
あー説明下手でごめん。
0971デフォルトの名無しさん
2008/03/09(日) 23:40:51レスありがとうございます。
>P154のweight*をよく見ると、(× weight* (first pora)) 2)、というのがあって2倍している。
説明不足でした。意味不明と書いたのは、以下のとおりです。
何かを減らしていくことでgoalに近づくというのは理解できます。
ただ、align関数とは何の関係も無いと思えるweight*関数の説明を
持ち出すことが、align関数のtotal function性(無限ループにはならない関数)
の証明になっているのかがピンときません。
align関数の中でlength*関数やweight*関数を使っているわけではないので。
(もちろん、length*関数、weight*関数それぞれの動作は理解できます。)
0972デフォルトの名無しさん
2008/03/10(月) 00:23:03weight*関数で何故一番目のコンポーネントを二倍する
必要があるのかは分かっていません。
alignの再帰が進むにつれて何かが減っていくということを定量的に
示すためにweight*を持ち出しているとは予想できるのですが、
weight* pora
1 (a)
3 (a b)
5 (a (b c))
7 ((a b) c)
例えば((a b) c)にshiftを実行すると、(a (b c)) になる。
このときweight*は7から5に減る。つまりゴールに向かっている。
ということは感覚では分かるのですが、何故weight*という関数
なんだろうか?ということなんですよね。
0973デフォルトの名無しさん
2008/03/10(月) 00:27:46weight*はtotal functionになってるけど、alignとlength*はそうじゃない。どういう場合にtotal functionといえるのか?
それはもう少し先まで読んでみるとわかる。
>align関数のtotal function性(無限ループにはならない関数)
>の証明になっているのかがピンときません。
この本は発見的に自分で違いを見つけさせる方針だから証明はしてない。
alignはtotal functionになってないことを理解しよう。
そして先を読んでみると他のtotal functionにならない例が出てくる。
典型的な例を知っておくと計算が終了しないバグに対する免疫ができる。
それがこの辺のねらい。とにかく先に進んでみる。
0974デフォルトの名無しさん
2008/03/10(月) 00:46:38>必要があるのかは分かっていません。
一番目のコンポーネントがsimplerになっているかどうかを定量的に評価するため。
例えば2ではない数でやってみるとどうなるかやってみるといい。3とか5とか7ではどうか?
>alignの再帰が進むにつれて何かが減っていくということを定量的に
>示すためにweight*を持ち出しているとは予想できるのですが、
これについては予想で終わらせずに、実際計算してみるほうがいい。
length*のようなsimplerになっているかどうかの定量的評価と、
weight*のようなsimplerになっているかどうかの定量的評価では
どちらが再帰関数のThe seventh commandmentを確認できるか?
0975デフォルトの名無しさん
2008/03/10(月) 11:05:05>>973
alignはpartial functionではないと書いてあるのですが、これは
alignがtotal functionであるという意味ではないんんでしょうか?
length*もatomの数を必ず返してくるのでtotal functionだと思ってる
のですが。
>典型的な例を知っておくと計算が終了しないバグに対する免疫ができる。
>それがこの辺のねらい。
なるほど。先に進んで見ます。
>>974
alignのtotal性の判断を難しくしているのは(align (shift pora))の部分ということで
、ここを考察しているわけですよね。else節では、second poraに対してalignが
再帰していますが、ここはsecondを適用しているので必ず元のリストより小さくなります。
つまり The seventh commandmentを満たしているのでtotal性の条件を満たしている。
問題の(align (shift pora))については、poraの性質を考えるとshiftを適用していけば
いつかは(atom? pora)が真になるか(a-pair? (first pora))が偽になることは明白です。
つまり、total性が分かっているelse節がいつかは実行される。これを定量的に表すために
length*を導入しても判断できなかった。何故なら、poraにshiftを適用し続けると
一番目のコンポーネントは徐々に短くなっていくのに、length*はそれを考慮していない。
そこで、一番目のコンポーネントを2倍(2以上なら可)していく重みを付けることが
必要だったということかなと思えました。
0976デフォルトの名無しさん
2008/03/10(月) 13:55:53英文の意味がわからないので教えてください。
What if we didn't have (define ...)
anymore? Could we still define length.
(予想)define文を何も持たなかった場合はどうですか?
それでもlengthを定義できますか?
Without (define...) nothing, and especially
not the body of length, could refer to length.
ここがわかりません。
0977デフォルトの名無しさん
2008/03/10(月) 14:17:49予想はそれでいい。
> Without (define...)
defineがなければ、
> nothing could refer to length.
誰もlengthを参照することができない。
> and especially not the body of length
lengthのボディからさえ参照することができないのだ。
and以下はnothingに付けられた修飾節。
誰も参照することはできないし、
今特に問題にしている再帰的定義のための、
λ式本体からの自分自身への参照も出来ない。
0978デフォルトの名無しさん
2008/03/10(月) 15:53:43ご丁寧にありがとうございました。
nothingが主語だということを気づけませんでした。
and especially...の文節は、倒置されていますか?
つまり、the body of lengthが主語。
省略しないで書くと
(予想)
and especially the body of length (could) not (refer to) length
特にlengthのボディ(定義部)が、lengthを参照できない。
>今特に問題にしている再帰的定義のための、
>λ式本体からの自分自身への参照も出来ない。
結局、lengthを定義する際に、λ式にdefineで名前を与えてやらないと、
λ式本体(lambda文の定義部)で、無限にλ式がネストしてしまう、
つまり定義不可能と理解しました。
0979デフォルトの名無しさん
2008/03/10(月) 17:36:330980デフォルトの名無しさん
2008/03/10(月) 17:40:40ご教示ありがとうございました。
0981デフォルトの名無しさん
2008/03/10(月) 17:46:34順番に展開してみたところ、明らかに文法上不正にも
関わらず、その部分が実行されないかぎりエラーとは
みなされないようですが、Schemeはそういう文化なのでしょうか?
(C++のテンプレートにもSFINAEというルールがありますが)
;length(<=1)
((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 ((mk-length eternity) (cdr l))))))))
;展開 第一段階
((lambda (mk-length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 ((mk-length eternity) (cdr l)))))))
(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 ((mk-length eternity) (cdr l)))))))
)
続く
0982デフォルトの名無しさん
2008/03/10(月) 17:58:06(lambda (l)
(cond
((null? l) 0) ; -----�@
(else (add1 (((lambda (mk-length)
(lambda (l)
(cond
((null? l) 0) ; -----�A
(else (add1 ((mk-length eternity) (cdr l))))))) eternity) (cdr l)))))) ;-----�B
ここで、nullリストかatomを一つだけ持つリストを渡してやると、それぞれ
上に示しました�@、�Aで処理が終了するので、正しい長さである0と1が返って
きます。疑問はありません。
ただ、定義上与えてはいけない二つのatomを持つリスト '(a b) などを
渡した場合を考えると、�Bの部分が実行されることになりますが、
add1の引数にlambda関数を渡すことになるので、引数として数字を一つだけ
とる仕様のadd1関数の文法に違反します。nullリストかatomを一つだけ持つ
リストを渡している限り�Bの部分は評価されないので、それはOKということに
なるのでしょうか?
0983デフォルトの名無しさん
2008/03/10(月) 18:12:04>>981 >>982 はeternityを使ってるのでadd1の文法違反ではなく
リスト(a b)に対しては無限ループになります。
;length0
((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (mk-length (cdr l))))))))
;展開 第一段階
((lambda (mk-length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (mk-length (cdr l)))))))
(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (mk-length (cdr l)))))))
)
0984デフォルトの名無しさん
2008/03/10(月) 18:12:42;展開 最終形
(lambda (l)
(cond
((null? l) 0)
(else (add1 ((lambda (mk-length) -----�B
(lambda (l)
(cond
((null? l) 0)
(else (add1 (mk-length (cdr l))))))) (cdr l))))))
本関数に atomを一つ持つリストを渡すと�Bの部分が評価されることになりますが
結果的に関数を渡すことになるためadd1の仕様に反し文法エラーになるはず。
nullリストだけを渡す限り�Bは実行されないのでエラーにはならず正しく0
が返ってきます。
0985デフォルトの名無しさん
2008/03/10(月) 20:15:35Y combinator の説明は展開が複雑すぎ。。
0986デフォルトの名無しさん
2008/03/10(月) 20:34:41λ式って本当におもしろい。
0987デフォルトの名無しさん
2008/03/10(月) 20:36:49Little Lisper には演習問題があるのでひとつ紹介しよう。
演習9.4:
With the Y-combinator we can reduce the number of arguments on which a function has to recur.
For example, member can be rewritten as:
(define member-Y
(lambda (a l)
((Y (lambda (recfun)
(lambda (l)
(cond
((null? l) nil)
(t (or
(eq? (car l) a)
(recfun (cdr l))))))))
l)))
Step through the application (member-Y a l) where a is x and l is (y x).
Rewrite the functions rember, insertR, and subst2 in a similar mannar.
0988デフォルトの名無しさん
2008/03/10(月) 20:40:090989デフォルトの名無しさん
2008/03/10(月) 20:43:30(Y
(lambda (recfun)
(lambda (l)
(cond
((null? l) 0)
(t (add1
(recfun (cdr l)))))))))
0990デフォルトの名無しさん
2008/03/10(月) 21:10:32In the chapter we have derived a Y-combinator that allows us to write recursive functions of one argument without using define.
Here is the Y-combinator for functions of two arguments:
(define Y2
(lambda (M)
((lambda (future)
(M (lambda (arg1 arg2)
((future future) arg1 arg2))))
(lambda (future)
(M (lambda (arg1 arg2)
((future future) arg1 arg2)))))))
Write the functions =, rempick, and pick using Y2.
Note: There is a version of (lambda ...) for defining a function of an arbitrary number of arguments, and an apply function for applying such a function to a list of arguments.
With this you can write a single Y-combinator for all functions.
0991デフォルトの名無しさん
2008/03/10(月) 21:25:05理屈を追っただけなので、まだ何がメリットなのかよくわからんです。
lengthならストレートに書いたほうが短くて全然わかりやすいし。
それとも普通の言語でいうアルゴリズム的存在で、
例えばスタックとかの理屈を理解したというレベルでしょうかね。
で、使っているうちにY-combinator自体がライブラリのような感覚
になっていって。。
気長にやります。
>>987
ありがとうございます。
やってみます。
0992デフォルトの名無しさん
2008/03/10(月) 21:26:58いただきます。
何で演習問題なくなってしまったんだろうか。
0993デフォルトの名無しさん
2008/03/10(月) 21:31:35>結局、lengthを定義する際に、λ式にdefineで名前を与えてやらないと、
>λ式本体(lambda文の定義部)で、無限にλ式がネストしてしまう、
>つまり定義不可能と理解しました。
ところが>>989をよくみるとY-combinatorのご利益がわかる。
これでdefineで名前空間を汚さなくて済むようになる。
0994デフォルトの名無しさん
2008/03/10(月) 21:36:49でも>>993で言ったように定義出来ることが確認できた。
>理屈を追っただけなので、まだ何がメリットなのかよくわからんです。
>lengthならストレートに書いたほうが短くて全然わかりやすいし。
もはや名前空間を汚さずに出来る。
コンビネーターの世界へようこそ!
0995デフォルトの名無しさん
2008/03/10(月) 21:39:470996デフォルトの名無しさん
2008/03/10(月) 21:41:17でもプログラムの中に毎回
(Y
(lambda (recfun)
(lambda (l)
(cond
((null? l) 0)
(t (add1
(recfun (cdr l))))))))
と記述するのは面倒です。インタラクティブに実行するときも
メンドイ。名前が無いととても扱いにくいです。
上の式自体にlengthって名前付けてしまうと、名前空間を汚さない
メリットが無いような。
0997デフォルトの名無しさん
2008/03/10(月) 21:42:33Daniel P. Friedman先生のHPにPSファイルがあります。
http://www.ccs.neu.edu/home/matthias/BTLS/
Exercises: TLL/3rdのリンクがそうかも。
0998デフォルトの名無しさん
2008/03/10(月) 21:46:56define名が無くても出来るってことですね。とは言っても名前空間を汚さない以外に
何かメリットはないものでしょうか、という疑問が。
修行します。
0999デフォルトの名無しさん
2008/03/10(月) 21:50:29(((lambda (M)
((lambda (future)
(M (lambda (arg)
((future future) arg))))
(lambda (future)
(M (lambda (arg)
(future future) arg))))))
(lambda (recfun)
(lambda (l)
(cond
((null? l) 0)
(t (add1 (recfun (cdr l))))))))
(quote (a b c)))
Whew, names may not be necessary, but they sure can be useful!
<<from Little Lisper P173>>
1000デフォルトの名無しさん
2008/03/10(月) 21:52:34Perhaps not after such a mind stretcher.
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。