- 1 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:14:56 ]
- 過去スレ
Part18: 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
- 741 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 11:25:16 ]
- >>738
それが一番しっくりくるかな
- 742 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:49:27 ]
- >>740
学生用のテキストは安いのを作ることがある。
- 743 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 14:04:29 ]
- >>742
ツルツル版もあるの?
- 744 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 14:05:50 ]
- ハッ!ハッ!ハッ!ハッ!
はげまるくーん
- 745 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 14:16:05 ]
- 醤油こぼしたらオシマイだよ。
- 746 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 14:17:46 ]
- Schemeすげー、関数を渡せるなんて。C#のdelegateの構文に似たような
ものがあったな。
- 747 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 20:41:32 ]
- 関数ぐらいCでも渡せるだろう
- 748 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 23:13:03 ]
- クロージャにしても継続にしても
Cでスタックを使うところにヒープを使えば自然と思いつきそうなものだが Schemeみたいな高級言語で教えるのとどっちが分かりやすいのかね
- 749 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 23:15:36 ]
- >>747
ポインタはね。関数は無理なのよ。しかも定義を呼び出し関数内に書ける のがいい。C++のBOOST_FOREACHに似てる感覚。
- 750 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 23:56:38 ]
- JavaScriptでも出来るぞw
- 751 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 00:05:37 ]
- 高級言語ならそれぐらい出来て当然
- 752 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 00:22:34 ]
- 高級言語w
- 753 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 03:20:15 ]
- wが意味するところがよくわからないんだが、
巷ではJavaScriptって、高級低級で二分するなら低級のほうに入るのか?
- 754 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 03:29:40 ]
- それはないw
- 755 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 03:39:48 ]
- javascriptは超高級だと思うぞ
高級・低級の分かれめってなんだか知らない(たぶん、時代によって変わる)けど、 lambdaが使える言語はみな高級だと思う。 あと、低級っていっても馬鹿にしてるわけじゃないことをお忘れ無く。
- 756 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 03:54:56 ]
- プログラミング初心者が集まる言語のスレなら
「ひょっとしてこの人、高級の意味を誤解してるのかな」 という想像が最初に来るところだけど、Lispスレだからな。一応「その心は?」と聞きたくなる。
- 757 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 04:36:48 ]
- まあ高次とか低レイヤーとか書いたほうが語弊は少なさそうだな
意味わかりにくくなるけど
- 758 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 09:18:13 ]
- 機械語に対してほとんど全てのプログラミング言語は高級言語だけどね。
今低級・高級を再定義するなら、機械が直接対応しない概念(クロージャとか)を 扱えるものが高級言語、でどうだろう。 シンタクスによる区別だったのをセマンティクスによる区別で再定義というか。
- 759 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 09:35:06 ]
- 実際のところ、CやC++のコンパイラは関数型言語で記述されてますか?
- 760 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 09:43:06 ]
- されてません
- 761 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 10:07:48 ]
- 環境にアクセスできるクロージャへのポインタを渡すのはCでは無理だな
- 762 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 12:28:20 ]
- boost.lambda
ならあるぞ
- 763 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 12:40:47 ]
- c-wrapperのデモビデオがみれなくなってる
std::vectorとかポインターをcに渡すことはできるの?
- 764 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 12:48:11 ]
- >>760
何で記述されてますか?
- 765 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 12:50:28 ]
- 「Cは昔、関数型言語って呼ばれてました。
値を返さない手続きがない(void以前)ので」ってオチ禁止
- 766 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 14:44:35 ]
- CコンパイラはCで書かれてることが多いんじゃないかな?
あまり関係ないけど GCCはLispライクな中間コードにコンパイルしてから CPUコードを出力するって聞いたことがあるけど
- 767 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 15:31:53 ]
- Little Schemerだけど Chapter 8から難しくなってきた。
-------------------------------------------------------- The Tenth Commandment Build functions to collect more than one value at a time. ”一度に複数の値を集めるための関数を作れ!” -------------------------------------------------------- これが言わんとする深い意味はなんですか? 直前のmultiremberEco関数の例で確かに二つのリストに振り分けてるのは 理解できるんだけど。(tunaに一致するもののリストと一致しないもののリスト) 条件に応じて、その条件を満足する値(アトムなど)あるいは満足しない値を集めろ! って意味なのかな?
- 768 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 21:33:46 ]
- >>763
>c-wrapperのデモビデオがみれなくなってる 今確認してみましたが、こちらからは見れました(ホームページのやつですよね)。 >std::vectorとかポインターをcに渡すことはできるの? ポインターの受け渡しはできますが、今のところ c-wrapper は C++ には 対応していないので、残念ながら std::vector は無理です。
- 769 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 22:25:51 ]
- >>767
俺もそこらへん読んでる。急に難しくなってきたね。 説明できないのでもうちょっとよく読んでみる…
- 770 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 00:44:35 ]
- > multiremberEco
multirember&co関数かと。
- 771 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:04:22 ]
- little schemer - multirember&co - reprise for dec 2006
groups.google.co.jp/group/comp.lang.scheme/browse_thread/thread/a059f78eb4457d08/be4705d06e96a2e4?hl=ja&lnk=gst&q=little+schemer+-+multirember%26co#
- 772 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 02:16:04 ]
- >>767
「at a time」でやることによって、 純関数型に特徴的なプログラミングスタイルが登場します。 昔birdが書いたコンパイラの純関数型ワン・パス・パーザや, DanvyのTABA(There and Back Again)パターンや、 purely functional algorithmに出てくるようなコードなどでも この章で使うようなテクニックが使われてます。 Little Schemeは非常に簡単な例でやっているので、 何が何だか分からない奇妙なパズルをやらされている気分になるかもしれませんが、 無意味なことはほとんどないので、著者を信じて頑張ってください。 まあバリバリ手続き型で書きたい人には苦行すぎる面もありますが。
- 773 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 12:01:59 ]
- >>770
&か。何の文字かわからなかった。 >>772 実用的なコードの源泉かあ。 今は習うより慣れろのレベルだけど、Schemerシリーズは全部やる。 単純な例でも脳の体操にもなるし。
- 774 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 21:26:31 ]
- www.amazon.com/Scheme-Programming-Language-3rd/dp/0262541483/
The Scheme Programming Language, 3rd Edition これは評価が高いですが、やはり良書ですか? CのK&R相当らしく、数日でたくさん学ぶ人もいるらしいですが どうなんでしょう。
- 775 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 21:42:06 ]
- >>774
Second Edition と村上さんの邦訳をもっているけど、 3rdはかなり改訂されてるんかい?
- 776 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 21:49:40 ]
- www.scheme.com/tspl3/
- 777 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 21:55:25 ]
- >>776
おお、公開されてるんだ。Dybvigさん、太っ腹。
- 778 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 21:59:06 ]
- Schemers.Incの「The Schemer's Guide」が好きだったなぁ。
初心者向けの良い本だと思う。
- 779 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 00:08:16 ]
- Little Schemer P146
にある以下のプログラムなんですが、 (define evens-only*&co (lambda (l col) (cond ((null? l) (col (quote ()) 1 0)) ((atom? (car l)) (cond ((even? (car l)) (evens-only*&co (cdr l) (lambda (newl P S) (col (cons (car l) newl) (* (car l) P) S)))) (else (evens-only*&co (cdr l) (lambda (newl P S) (col newl P (+ (car l) S))))))) (else (evens-only*&co (car l) ; ここから以下がよく理解できない (lambda (al ap as) (evens-only*&co (cdr l) (lambda (dl dp ds) (col (cons al dl) (* ap dp) (+ as ds)))))))))) 特に (col (cons al dl) (* ap dp) (+ as ds)) とする意味が分かりません。 こういうものはどういう思考で捉えていけば良いのでしょうか? 具体値で考えると確かに正しいことは分かるのですが、それを一般式で 表すのが難しくて思いつきません。
- 780 名前:779 mailto:sage [2008/03/02(日) 00:31:17 ]
- 具体値を入れて考えたメモを見ていたら何となく見てきました。
(evens-only*&co (car l) ; ここから以下がよく理解できない (lambda (al ap as) (evens-only*&co (cdr l) (lambda (dl dp ds) (col (cons al dl) (* ap dp) (+ as ds)))))))))) (car l) と (cdr l) について再帰してそれぞれの結果を得る。 まず、(cdr l) に対して結果を得る。つまり、dl dp ds が具体値に 決まる。その後、その結果に対して、(car l) に対する再帰の結果 である al ap as を得て、(cdr l) に対する結果とマージする。 よく分からなかったのはlambda関数のパラメータでした。 自分としてのキーポイントは、 @lambda関数のパラメータが具体値に求まる。 Alambda関数のパラメータが具体値に求まる順番はネストの深い ものから始まる。 という風に考えるとよいかなと思いました。
- 781 名前:779 mailto:sage [2008/03/02(日) 00:36:37 ]
- 表現がおかしかったです。
(evens-only*&co (cdr l) (lambda (dl dp ds) (col (cons al dl) (* ap dp) (+ as ds))) 要は、まず上の部分の (cdr l) の再帰が先に終了し、そのパラメータであるdl dp ds が具体値に求まる。その後で、具体値に求まったdl dp dsとともに (evens-only*&co (car l) (lambda (al ap as) ・・・の (car l) の部分の再帰が行われる。
- 782 名前:779 mailto:sage [2008/03/02(日) 00:42:43 ]
- やはりパラメータが具体値に求まるというのはおかしいですね。
パラメータは変数なので。。 ただ具体的な値で追っていくと、例えば (col (cons al (2 4)) (* ap 8) (+ as 4))) みたいな感じで、dl dp ds 部分が決まっていくようです。 パラメータが具体値に求まるというのは、その程度の意味です。
- 783 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 01:58:27 ]
- >>779-782
; direct style (define (fact n) (if (= n 0) 1 (* n (fact (- n 1))))) ; accumulator style (define (fact n) (factacc n 1)) (define (factacc n acc) (if (= n 0) acc (factacc (- n 1) (* n acc)))) ; continuation passing style (define (fact n) (factacc n (lambda () 1))) (define (factacc n cc) (if (= n 0) (cc) (factacc (- n 1) (lambda () (* n (cc)))))) accumulator styleは演算子が可換、 あるいは逆から数え上げることが可能(e.g. (from n) ←→(to n))でないと困る。 例えばリストに対する演算の場合。consは可換でない。
|

|