08/02/22 13:01:00
>>695
そういう「特殊な」ことをやる場所ではfuncallを使う。
そういうとこへ関数を渡すときは #' を付けてましょう。
というのが CL 的発想だと思う。大きなプログラムの中での可読性を
考えれば、そんなに悪くないと思う。
純潔なSchemerには我慢できないだろうけど。w
698:デフォルトの名無しさん
08/02/22 13:29:54
>>695
> 関数とその他の値とを区別無くfirst class objectとして扱うコードを
CLが違うのはシンボルにセルが2つあるのと関数を適用するときの特別扱いであって、
「区別無くfirst class objectとして扱う」こと自体は普通に書けるじゃん。
699:デフォルトの名無しさん
08/02/22 13:40:16
座席が区別されてるだけで乗客は区別されない
700:デフォルトの名無しさん
08/02/22 13:43:02
>>696
>一つしかない場合もその種の議論は成立する
そうです
Schemeでも関数なのかマクロなのか判断できなくて困ることがある
CLを汚いと言えるほどSchemeは綺麗じゃない
変数と関数じゃなくて
コンパイル時と実行時とで名前空間を分ければいいのかな?
701:デフォルトの名無しさん
08/02/22 13:44:44
俺は人間が汚れてるから、ちょっと汚い言語のほうが好きだな
702:695
08/02/22 13:51:18
>>697>>698>>699
なるほど
703:デフォルトの名無しさん
08/02/23 12:21:19
>>688
>Gauche c-wrapperはswigみたいなもの?
そう、ヘッダファイルからスタブを自動生成して関数やデータやマクロなんかをGaucheで使えるようにするもの。
>なんでswigにしなかったの?
最初swigを見たとき、バインディングの作り方がよく分からなかったから。
あと、コンパイルとかInterfaceファイルを作るのが面倒そうだったから。
704:デフォルトの名無しさん
08/02/23 17:07:34
The Reasoned Schemer
この本はどのような人を対象としてるか読んだ人分かりますか?
なんかProlog的なコーディングをSchemeでもできるという紹介
文でしたが、これはScheme的ではない異色の内容なんですかね?
705:デフォルトの名無しさん
08/02/23 17:21:57
とてもScheme的な応用の本。
言語プリミティブ的なものが応用対象だから。
706:デフォルトの名無しさん
08/02/24 17:18:06
LispとPrologとは両輪だという話を読んだ覚えがある。
On LispでもPrologやってるし。
707:デフォルトの名無しさん
08/02/24 17:20:49
両輪というより、レイヤーが違う感じかな
708:デフォルトの名無しさん
08/02/24 17:30:57
Lisp/Schemeにはないが、
ML/Haskellはパターンマッチ渡しがあるから、
論理型言語とは「項書換えシステム」で統一的な見方ができる。
The Reasoned Schemerはその点でも面白い。S式は面白い。
709:デフォルトの名無しさん
08/02/24 17:50:24
買ってみようかな
710:デフォルトの名無しさん
08/02/24 17:58:54
The Little Schemerで教えてください。 P.121です。
1> (apples peaches pumpkin pie) はrelではない。なぜならペアのリストではないから。
2> ((apples peaches) (pumpkin pie) (apples peaches)) はrelではない。ペアのセットではないから。
3> ((apples peaches) (pumpkin pie)) はrelですか? yes
4> ((4 3) (4 2) (7 6) (6 2) (3 4)) はrelですか? yes
どういうことなのかさっぱりわかりません。
711:デフォルトの名無しさん
08/02/24 18:02:25
>>710
まだそこまで読んでない。
712:デフォルトの名無しさん
08/02/24 18:09:41
「セット」は重複要素を許しません。それで後は分かりませんか?
;; カッコに全角を使うのは辞めてください。釣りかと思います。
713:デフォルトの名無しさん
08/02/24 18:15:06
>>712
サンクス!そういうことか!
ていうか、章の始めで教わってんじゃん・・・1日悩んじまったorz
全角ゴメン。気をつけます!
てかP.121じゃなくてP.119だし・・・
714:デフォルトの名無しさん
08/02/25 19:07:24
javascriptがlispに匹敵する表現力があるって聞いたのだけど本当?
715:デフォルトの名無しさん
08/02/25 19:39:24
brainfuckですらLispに匹敵する表現力がありますけど?
716:デフォルトの名無しさん
08/02/25 19:40:14
>>714
ecmaスレで聞けよw
717:デフォルトの名無しさん
08/02/25 20:31:44
アセンブラ表現力最強ですけどっ!!
718:デフォルトの名無しさん
08/02/25 20:35:09
表現力最強じゃなくて記述力最強だ
まあいいや
719:デフォルトの名無しさん
08/02/25 20:37:18
どちらにしても曖昧だな。強弱比較できるような概念でもあるまい。
720:デフォルトの名無しさん
08/02/25 21:01:45
スペックじゃんけんがしたいならHaskellを選べばいいと思うよ。
721:デフォルトの名無しさん
08/02/25 21:11:19
brainfuckにすら負けてる正規表現やcppの立場って・・・
722:デフォルトの名無しさん
08/02/25 21:19:45
そのためのPEGとtemplateだろ?
723:デフォルトの名無しさん
08/02/26 00:19:15
初心者は抽象化が苦手だ、とMatzが言ってた
チューリング完全性だけが重要なら、抽象化はどうでもいいはずだが、現実は違う
724:デフォルトの名無しさん
08/02/26 00:48:20
>>714
JavascriptのクラスシステムはJavascriptで書かれてます。
次のバージョンからは組み込みになりますが。
prototype base object systemあたりでググってください。
725:デフォルトの名無しさん
08/02/26 13:22:52
Little schemer P122 P123 に出てきた
Go and get one!
Or better yet, make your own.
は
”先へ進んで、完璧を目指せ!
もっといいのは、自分の力でやることだ。”
という意味であってる?
726:デフォルトの名無しさん
08/02/26 22:17:26
>>725
邦訳の「Scheme手習い」元吉文男、横山晶一訳
たぶん、7章の最後の文だと思うんだけど。
「自分で行って手に入れよ。
さもなくば、独自のものを作れ」
となっている。
727:デフォルトの名無しさん
08/02/26 22:34:52
俺はなんかそんな堅苦しいメッセージじゃなくて、
「ここで一休み、お菓子取ってきなよ♪
でなきゃ、自分で作ってみてはどうかな?」
という意味に取ったけど。
728:デフォルトの名無しさん
08/02/26 22:38:29
>>726
全然違ってた。。
邦訳なんかあったんだ
まあ内容には関係ないからいいか
>>727
お菓子はないだろw
729:デフォルトの名無しさん
08/02/26 22:41:23
>>728
いや、まじめに。だってクッキーの作り方書いてあるじゃん。
730:デフォルトの名無しさん
08/02/26 22:50:15
>>726
その訳でクッキーのレシピはどうなってるの?
731:デフォルトの名無しさん
08/02/26 22:53:27
>>729
ああ、あの囲みのコード?
おれはてっきりあれを自分で完成させろということかと思った。
アメリカンジョーク?
732:デフォルトの名無しさん
08/02/26 22:55:26
>>731
あのコードをみて Make your own cokkies.ということかと・・・・
てか、度々「一休みしてお菓子食べなよ!マスタード忘れないようにNE!」
みたいなメッセージが出てきてるじゃん?
733:デフォルトの名無しさん
08/02/26 22:58:15
>>730
クッキーのレシピがlambda式風に書かれている。
戒律風に訳されているので、この部分も戒律風にわざと訳したのかもね。
734:デフォルトの名無しさん
08/02/26 23:00:22
(define クッキー
(lambda ()
(焼く
(quote (180 度))
(quote (12 分))
735:デフォルトの名無しさん
08/02/26 23:02:47
>>733
そんな風になってるのか。
736:デフォルトの名無しさん
08/02/26 23:02:51
アメリカンジョークというより、ウィットという感じかな。
737:デフォルトの名無しさん
08/02/26 23:03:45
もうフリードマンさんの本全部読んでみたくなってきたw
738:デフォルトの名無しさん
08/02/27 01:17:17
>>725
後半は、
「まだまだいいのがあると思うなら、自分で作ることだね」
739:デフォルトの名無しさん
08/02/27 01:45:50
URLリンク(www.ccs.neu.edu)
> A Food Preparation Place
740:デフォルトの名無しさん
08/02/28 10:57:55
Little Schemer
Seasoned Schemer
Reasoned Schemer
があるんだけど、Little Schemerだけ紙質が悪いんだが
何で?わら半紙みたいでツルツルしてない。
741:デフォルトの名無しさん
08/02/28 11:25:16
>>738
それが一番しっくりくるかな
742:デフォルトの名無しさん
08/02/28 13:49:27
>>740
学生用のテキストは安いのを作ることがある。
743:デフォルトの名無しさん
08/02/28 14:04:29
>>742
ツルツル版もあるの?
744:デフォルトの名無しさん
08/02/28 14:05:50
ハッ!ハッ!ハッ!ハッ!
はげまるくーん
745:デフォルトの名無しさん
08/02/28 14:16:05
醤油こぼしたらオシマイだよ。
746:デフォルトの名無しさん
08/02/28 14:17:46
Schemeすげー、関数を渡せるなんて。C#のdelegateの構文に似たような
ものがあったな。
747:デフォルトの名無しさん
08/02/28 20:41:32
関数ぐらいCでも渡せるだろう
748:デフォルトの名無しさん
08/02/28 23:13:03
クロージャにしても継続にしても
Cでスタックを使うところにヒープを使えば自然と思いつきそうなものだが
Schemeみたいな高級言語で教えるのとどっちが分かりやすいのかね
749:デフォルトの名無しさん
08/02/28 23:15:36
>>747
ポインタはね。関数は無理なのよ。しかも定義を呼び出し関数内に書ける
のがいい。C++のBOOST_FOREACHに似てる感覚。
750:デフォルトの名無しさん
08/02/28 23:56:38
JavaScriptでも出来るぞw
751:デフォルトの名無しさん
08/02/29 00:05:37
高級言語ならそれぐらい出来て当然
752:デフォルトの名無しさん
08/02/29 00:22:34
高級言語w
753:デフォルトの名無しさん
08/02/29 03:20:15
wが意味するところがよくわからないんだが、
巷ではJavaScriptって、高級低級で二分するなら低級のほうに入るのか?
754:デフォルトの名無しさん
08/02/29 03:29:40
それはないw
755:デフォルトの名無しさん
08/02/29 03:39:48
javascriptは超高級だと思うぞ
高級・低級の分かれめってなんだか知らない(たぶん、時代によって変わる)けど、
lambdaが使える言語はみな高級だと思う。
あと、低級っていっても馬鹿にしてるわけじゃないことをお忘れ無く。
756:デフォルトの名無しさん
08/02/29 03:54:56
プログラミング初心者が集まる言語のスレなら
「ひょっとしてこの人、高級の意味を誤解してるのかな」
という想像が最初に来るところだけど、Lispスレだからな。一応「その心は?」と聞きたくなる。
757:デフォルトの名無しさん
08/02/29 04:36:48
まあ高次とか低レイヤーとか書いたほうが語弊は少なさそうだな
意味わかりにくくなるけど
758:デフォルトの名無しさん
08/02/29 09:18:13
機械語に対してほとんど全てのプログラミング言語は高級言語だけどね。
今低級・高級を再定義するなら、機械が直接対応しない概念(クロージャとか)を
扱えるものが高級言語、でどうだろう。
シンタクスによる区別だったのをセマンティクスによる区別で再定義というか。
759:デフォルトの名無しさん
08/02/29 09:35:06
実際のところ、CやC++のコンパイラは関数型言語で記述されてますか?
760:デフォルトの名無しさん
08/02/29 09:43:06
されてません
761:デフォルトの名無しさん
08/02/29 10:07:48
環境にアクセスできるクロージャへのポインタを渡すのはCでは無理だな
762:デフォルトの名無しさん
08/02/29 12:28:20
boost.lambda
ならあるぞ
763:デフォルトの名無しさん
08/02/29 12:40:47
c-wrapperのデモビデオがみれなくなってる
std::vectorとかポインターをcに渡すことはできるの?
764:デフォルトの名無しさん
08/02/29 12:48:11
>>760
何で記述されてますか?
765:デフォルトの名無しさん
08/02/29 12:50:28
「Cは昔、関数型言語って呼ばれてました。
値を返さない手続きがない(void以前)ので」ってオチ禁止
766:デフォルトの名無しさん
08/02/29 14:44:35
CコンパイラはCで書かれてることが多いんじゃないかな?
あまり関係ないけど
GCCはLispライクな中間コードにコンパイルしてから
CPUコードを出力するって聞いたことがあるけど
767:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/29 21:33:46
>>763
>c-wrapperのデモビデオがみれなくなってる
今確認してみましたが、こちらからは見れました(ホームページのやつですよね)。
>std::vectorとかポインターをcに渡すことはできるの?
ポインターの受け渡しはできますが、今のところ c-wrapper は C++ には
対応していないので、残念ながら std::vector は無理です。
769:デフォルトの名無しさん
08/02/29 22:25:51
>>767
俺もそこらへん読んでる。急に難しくなってきたね。
説明できないのでもうちょっとよく読んでみる…
770:デフォルトの名無しさん
08/03/01 00:44:35
> multiremberEco
multirember&co関数かと。
771:デフォルトの名無しさん
08/03/01 01:04:22
little schemer - multirember&co - reprise for dec 2006
URLリンク(groups.google.co.jp)
772:デフォルトの名無しさん
08/03/01 02:16:04
>>767
「at a time」でやることによって、
純関数型に特徴的なプログラミングスタイルが登場します。
昔birdが書いたコンパイラの純関数型ワン・パス・パーザや,
DanvyのTABA(There and Back Again)パターンや、
purely functional algorithmに出てくるようなコードなどでも
この章で使うようなテクニックが使われてます。
Little Schemeは非常に簡単な例でやっているので、
何が何だか分からない奇妙なパズルをやらされている気分になるかもしれませんが、
無意味なことはほとんどないので、著者を信じて頑張ってください。
まあバリバリ手続き型で書きたい人には苦行すぎる面もありますが。
773:デフォルトの名無しさん
08/03/01 12:01:59
>>770
&か。何の文字かわからなかった。
>>772
実用的なコードの源泉かあ。
今は習うより慣れろのレベルだけど、Schemerシリーズは全部やる。
単純な例でも脳の体操にもなるし。
774:デフォルトの名無しさん
08/03/01 21:26:31
URLリンク(www.amazon.com)
The Scheme Programming Language, 3rd Edition
これは評価が高いですが、やはり良書ですか?
CのK&R相当らしく、数日でたくさん学ぶ人もいるらしいですが
どうなんでしょう。
775:デフォルトの名無しさん
08/03/01 21:42:06
>>774
Second Edition と村上さんの邦訳をもっているけど、
3rdはかなり改訂されてるんかい?
776:デフォルトの名無しさん
08/03/01 21:49:40
URLリンク(www.scheme.com)
777:デフォルトの名無しさん
08/03/01 21:55:25
>>776
おお、公開されてるんだ。Dybvigさん、太っ腹。
778:デフォルトの名無しさん
08/03/01 21:59:06
Schemers.Incの「The Schemer's Guide」が好きだったなぁ。
初心者向けの良い本だと思う。
779:デフォルトの名無しさん
08/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
08/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関数のパラメータが具体値に求まる。
②lambda関数のパラメータが具体値に求まる順番はネストの深い
ものから始まる。
という風に考えるとよいかなと思いました。
781:779
08/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
08/03/02 00:42:43
やはりパラメータが具体値に求まるというのはおかしいですね。
パラメータは変数なので。。
ただ具体的な値で追っていくと、例えば
(col (cons al (2 4)) (* ap 8) (+ as 4)))
みたいな感じで、dl dp ds 部分が決まっていくようです。
パラメータが具体値に求まるというのは、その程度の意味です。
783:デフォルトの名無しさん
08/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は可換でない。