トップページtech
1001コメント388KB

Common Lisp, Scheme Part 14

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/11/18(金) 10:02:06
過去スレ
Part1: http://piza2.2ch.net/tech/kako/987/987169286.html
Part2: http://pc.2ch.net/tech/kako/1002/10025/1002584344.html
Part3: http://pc.2ch.net/tech/kako/1008/10082/1008220265.html
Part4: http://pc.2ch.net/tech/kako/1016/10162/1016211619.html
Part5: http://pc3.2ch.net/tech/kako/1023/10230/1023091882.html
Part6: http://pc3.2ch.net/tech/kako/1031/10315/1031560687.html
Part7: http://pc5.2ch.net/tech/kako/1042/10421/1042167213.html
Part8: http://pc5.2ch.net/tech/kako/1058/10582/1058263391.html
Part9: http://pc2.2ch.net/test/read.cgi/tech/1069594582/
Part10: http://pc5.2ch.net/test/read.cgi/tech/1075630259/
Part11: http://pc5.2ch.net/test/read.cgi/tech/1091456033/
Part12: http://pc8.2ch.net/test/read.cgi/tech/1100229366/
Part13: http://pc8.2ch.net/test/read.cgi/tech/1115901841/
01531142005/12/04(日) 16:25:53
>>149
俺もそれしか無い気がしたが、Common Lisperの間でそういうスタイルが
一般的だとかいう話は聞いたことがないので。
あと、一番俺にとって重要なのはタイプするのが面倒だとかいうくだらないこと。
>>151
マクロがあるからLispに興味あるんだが、
ありふれたことをするのにも、例えば、大抵の問題を扱うのに
メッセージ伝達モデルのほうがタイプ量減るからといって、
マイ言語の世界に突入しなきゃならんのはどうかと。
共通プロトコルが安定してないとJavaみたいな大規模なライブラリなんて
作れないでしょ。
総称関数で書かれたライブラリと
メッセージ伝達モデルのオブジェクトシステムで書かれたライブラリが
平気で混在してるのがある意味、理想的な状況にも思えるけど、どうかな?
そんなのおぞましいって思うかな?
01541522005/12/04(日) 16:46:45
俺、ちょっと論点はずしたかな?
パッケージ内で偶然バッティングするケースもあると思うけど、
「同じパッケージ内でも気にしたくない」ってのは、ちょっと
どうかと思うけど。気にしろよ、とか思う。

ってか、プログラマが「気にできる」範囲に分割するのがパッケージの
役割なんだから、「気にしたくない」なら、さらに分割すべき

だけど、その制限が「仕様として」どうか、ときかれれば、まぁ、
ちょっと恣意的な制限ではあると思う。
01551492005/12/04(日) 19:08:31
>>153
だから>>149で「メソッド名はクラス名をプレフィックスするなりして一意に」という
のはあくまで「極端な話」だってばさ。基本的には>>152氏も言っているように
同じ名称のメソッドは対象となるクラスが異なっても同じ機能を持つはずであって
同じパターンで引数を取るはずであるというのが設計思想の根底にあると思う。

あとは昔のbit別冊に載ってた記憶があるが効率の問題もあるかもしれん。
0156デフォルトの名無しさん2005/12/04(日) 21:44:51
>>153
メッセージという特定のクラス系統に特定の意味を持つものにgenericな
名前をつけてしまうのがオブジェクト・セントリックな世界から頭を
切り替えられない人の敗因。

C++やJavaのメソッドの名前というのはあくまである対象固有の操作に
つける名前であるから、その一面を切り取って命名しているに過ぎない
(または名前がもつ意味の一面しかその操作が表していないとも言える)。
だから対象となる系統が変われば同じ名前の操作でも引数の数から何から
変わるということがおこりえる。それはメリットでもあれば統一した意味論で
全てのクラスを語れないというデメリットでもある。

generic functionは例えばC++のコンテナでpush_backというメンバ関数の
形式と意味論が共通に約束されているとか(イテレータの++や*演算子もそうだ)、
Ruby方面でいうduck typingに近い。
だから特定のクラス系統にのみ意味を持つものなら、それ相応に特定的な動詞が
思い付かないならそれを示すプレフィクスを付けるのが一番安全。
でなきゃパッケージで区切る。

あくまでbruteにメッセージ形式を持ち込みたいなら、メッセージと対応する処理を
定義するマクロを作って、あとはメッセージをsendする関数を作ってしまうのが
いいんじゃないか。
全体で合意できるのはレシーバとなる第一引数の存在くらいしかないのだろうから。

個人的にはC++にも(最近ではJava方面も?)Generic Programmingという概念は
入っているだろうに、なぜそっちからLispにくる人はそれを理解の一助とせず
無視するのかが理解に苦しむところ。
0157デフォルトの名無しさん2005/12/04(日) 21:48:46
少し訂正。
> 入っているだろうに、なぜそっちからLispにくる人はそれを理解の一助とせず
> 無視するのかが理解に苦しむところ。

自分もC++やJavaからLispに入ってきた人なのだった。
なぜ114のような文句垂れる人は、にしておこう。
0158デフォルトの名無しさん2005/12/04(日) 23:46:20
>156
>だから特定のクラス系統にのみ意味を持つものなら、それ相応に特定的な動詞が
>思い付かないならそれを示すプレフィクスを付けるのが一番安全。

それじゃCに逆戻りなんだよね……名前空間の便利さを知ると、とてもじゃないけど
やってらんない。関連性の高い関数とオブジェクトはセットで管理したいですな。

LISPでも名前空間の実装無いの?
0159デフォルトの名無しさん2005/12/05(月) 00:15:11
>>158
その引用部分の直後に書いてあるけど、パッケージ。
0160デフォルトの名無しさん2005/12/05(月) 00:18:03
>>158
だから、そのためのパッケージだべさ。
0161デフォルトの名無しさん2005/12/05(月) 00:26:14
どーしても同じ名前で別な lambda list なメソッドを使いたいなら
(defun hoge (&rest args) ...)
で受けて手動ディスパッチすりゃいいんじゃねーの?
処理系によっては defmethod するより typecase で分岐の方が速かったりするし。
0162デフォルトの名無しさん2005/12/05(月) 01:03:32
愚痴ってる連中はまず自分で理想のオブジェクトシステムを定義してみろよ。
で、それを実装してみればいいじゃないか。
01631582005/12/05(月) 01:40:41
>159-160
なるほど。

パッケージの名前解決ってどんな感じ?(C++みたいに)引数の型の定義に近い
メソッドを検索して持ってくるの?それともやっぱりパッケージ名で修飾しないとダメ?
0164デフォルトの名無しさん2005/12/05(月) 02:30:38
>個人的にはC++にも(最近ではJava方面も?)Generic Programmingという概念は
>入っているだろうに、なぜそっちからLispにくる人はそれを理解の一助とせず
>無視するのかが理解に苦しむところ。

そんなの簡単。そっちも理解できないから。
そして自分の頭に既にある図面(しかも半端な)にあてはめることでしかものを理解できない・しようとしないわけさ。
0165デフォルトの名無しさん2005/12/05(月) 02:37:52
ここんとこC++でいやいや仕事させられてるんで変なライブラリとかも見る機会が
あるんだが、BOOSTとか見ると何であんな複雑怪奇なことをしてGeneric Programmingに
取り組んでいるのか理解に苦しむ。素直にLisp/Scheme使えばいいのに・・・
アレは理解できない・というよりしたくない。エラーメッセージもわけわからんし、
修正→コンパイル→デバッグのサイクルに費やす時間が異常に長いしで不毛なことこの上なし。
0166デフォルトの名無しさん2005/12/05(月) 03:40:22
>>165
確かに boost の lambda は笑った。すべてをコンパイル時にやろうという
C++ の執念は凄いが、実用性は?だよね。
0167デフォルトの名無しさん2005/12/05(月) 10:04:03
全てはUNIX/Cの呪縛
0168デフォルトの名無しさん2005/12/05(月) 11:55:30
C言語って現代的な高級言語からみた機械語
0169デフォルトの名無しさん2005/12/05(月) 16:38:19
Cは遥か昔から高級アセンブラと呼ばれてますが何か?
0170デフォルトの名無しさん2005/12/05(月) 17:40:02
はあ、それが何か?
01711142005/12/05(月) 21:41:42
>>156は人の話を聞かずに言いたいことばかり言っている。
>>だから特定のクラス系統にのみ意味を持つものなら、それ相応に特定的な動詞が
>>思い付かないならそれを示すプレフィクスを付けるのが一番安全。
>>でなきゃパッケージで区切る。
だから、そうするしかないねえ、という話をすぐ上でしている。
そして、俺はそれすら 面倒 だという下らない話をしてるんだよ。
タイプ量が増えるからな。
CLOSのモデルに合わせてプログラムを書けないなんて話は
俺の最初の書き込み以降、誰一人していない。
逆にgeneric functionも必要/有用だと認める意見が多かった気がするがな。
ただ、多重ディスパッチを必要としないプログラムを書いてる限り、それは
タイプ量と考慮すべきことを増やすだけで、それが他のOO言語に慣れた人間には
納得のいくトレードオフに思えないことは結構多いんじゃないか?
そもそも、Gaucheに無い制限を持つCLOSの話題から始まったことも忘れるなよ。
RubyやPythonから今のオブジェクトシステムを除いて、
CLOSだけを加えたらどうなるか考えてみろよ。
俺の普段の仕事には多重ディスパッチなんかより、
Rubyみたいな属性アクセスの抽象化と実際のアクセスを
少ないタイプ量で(マイ言語の世界も構築せずに)できる機能のほうが全然重要だったりする。
っつーか、たまにそういう要求に出会ったら、それこそ
自分でディスパッチの仕組みを作ったっていいんじゃないかと思ったりもする。
そういう場合、対象の集合が持つ性質は多分、かなり予期・コントロールできると想像する。
つまり、その集合、その問題に特化したディスパッチシステムを作るのは容易な可能性が高い。
だけど、無引数のget-hogeを定義したあとで、なんらかのキーを引数に要求する
get-hogeを継承関係にすらない異クラスに追加したくならないか、
なんて予期できないんだよ。
01721142005/12/05(月) 21:42:56
ちなみに俺はCLOSの制限でイラついてるCommon Lisperはあまり居ないらしいっていう
統計的情報(?)を聞けた時点で、ほとんど満足なわけだが、156みたいなアホがいるから
反論したくなる。
メッセージ伝達モデルを欲しがる人間をあからさまに馬鹿にする態度が気に食わない。
CLOSなんて唯のライブラリでLispの本質じゃないのにさ。
Paul Grahamのエッセイを読んでみろよ。
クロージャ詰め込んだハッシュなんて、まんまメッセージのレシーバじゃないか。
0173デフォルトの名無しさん2005/12/05(月) 21:46:02
申し訳ないが、今忙しいので長い文章は読めない。
ごめんね。暇になったら必ず読むよ。
0174デフォルトの名無しさん2005/12/05(月) 22:51:00
>>171
あんまり重要じゃないところに突っ込むけどさ、Paul Grahamも、
Common Lispが、"タイプ量"的にまずいってことは認めてるし、
まぁ、欠点は欠点として認めるとして、
タイプ量をケチるなら、それなりのエディタを使うとか、
そもそもCommonLispは使わないとか、そういう方向になるんじゃ
ないのかな?
タイプ量からCLOS批判するのは少し納得がいかない希ガス。
0175デフォルトの名無しさん2005/12/05(月) 23:55:51
CLOS ってようするに、あんまり役にたたんということか。
dispatch だけだったら CLOS なしでも大差ないだろ。
それとも optimize とかが何か違うのか。
0176デフォルトの名無しさん2005/12/05(月) 23:59:47
> メッセージ伝達モデルを欲しがる人間をあからさまに馬鹿にする態度が気に食わない

>>114>>116 あたりの自分の態度を見直したほうがいいよ…。
同じ Gauche 使ってる身としては、Common な人々は心が広いなーと思た。
残念だろうけど、どっちかというとアホなのは 156 じゃなくて 114 だと思うよ…
0177デフォルトの名無しさん2005/12/06(火) 00:28:03
Beyond Java?
http://www.functionalobjects.com/resources/beyond-java.phtml
0178デフォルトの名無しさん2005/12/06(火) 01:17:37
結局、generic programmingを理解しようとせずに、元から考え方の違う道具で
自分のやり方が実現できないと文句言ってるだけの人だったね。
Haskellは変数を破壊的に変更できないから使い物にならん、というのと同レベル。

ついでにいうとgeneric functionのlambda listが合同なのはgeneric function
っつーくらいだから本来当たり前の話で、
Tiny CLOSでlambda listが違っても使えるってのの方が単なる余録。
01791582005/12/06(火) 02:26:00
誰か >163 にコメントを……
いくらパッケージで分割できるつうても、自動的に名前解決してくれないんだったら
プリフィックスと同じで不便なことには変わりないなぁ。

というか、おまいら名前空間・generic programming・メッセージングその他もろもろを
ごっちゃにしとらんか?傍目からは疑似問題起こしとるような気がしてならんが……
0180デフォルトの名無しさん2005/12/06(火) 03:02:09
どちらかというと、ごっちゃにしてるというか理解してないのは君。
156を理解せずにかろうじて食いつけるところだけ食いついてみた
という感じだけど、元々理解できてないから完全に見当外れ。
だからコメントもつかない、つまり相手にされてない。
0181デフォルトの名無しさん2005/12/06(火) 05:35:51
何か必死なやつが一人いる予感...
0182デフォルトの名無しさん2005/12/06(火) 05:59:26
元のテーマも忘れかけてそうだよね
0183デフォルトの名無しさん2005/12/06(火) 06:48:14
>>179
ttp://user.ecc.u-tokyo.ac.jp/~t50473/onlispjhtml/packages.html
検索くらいしる。

・Lispの型は値に、C++の型は変数名にくっついている
・CLOSのgenricは実行時、C++のgenericはコンパイル時にメソッドが選ばれる
・CLOSのmethodはオブジェクトに属さない
この辺ちゃんと理解してる?
0184デフォルトの名無しさん2005/12/06(火) 08:14:38
CLOS の method はスパーンと切り込むキラーパスのようなイメージ。
レシーバを規定する method は鎖で繋がれたペットみたいなイメージ。
0185デフォルトの名無しさん2005/12/06(火) 20:26:20
昔、湯浅先生の本とともに、DOS版のTUTSchemeっていうのを買って
使ってたのを思い出して、ググってみたら今でもあるんですね。

ttp://www.yuasa.kuis.kyoto-u.ac.jp/~komiya/tus_intro.html

UNIX版を落として使ってみたら、テラナツカス

ちょっと遅いけど、いろんなプラットフォームで動くし、
エディタついてるし、お勉強用には良いかも。

tusとかmtusとか、cmtusとかstusとか作れるみたいだけど
違いはなんだろ?
0186デフォルトの名無しさん2005/12/08(木) 10:57:59
RubyがLispの良い点を継承しているので、「受け入れられる」Lispになるかも
しれないという話。
http://www.rubyist.net/~matz/20051205.html#p02
0187デフォルトの名無しさん2005/12/08(木) 11:13:42
元のblogは読まずにmatzのブログしか読んでないんか。
0188デフォルトの名無しさん2005/12/08(木) 11:14:31
>>186
Lisperから見ると、良い点の大半を捨てたように見えるんだけどな。
0189デフォルトの名無しさん2005/12/08(木) 11:38:16
Rubyはいい言語だと思うが、acceptable LispというにしてはLispから
かけ離れすぎてて無理があると思う。
Lispにない利点もあり、Lisperにも(どの言語にもあるような機能の範囲では)
ストレス少ないので、
more acceptable (かつ、いくつかの面ではmore comfortable) than Lisp
ではあると思う。
関数型的な利用にはあんまり向かないよね。
思考の枠組みとしてはLispより狭いけど、まあそれで十分なことも多い。
0190デフォルトの名無しさん2005/12/08(木) 23:24:14
よしキラーアプリ作ってLispの王国を復活させるんだ!
…と思ったけどmatz氏が良い指摘をしてるね。
一般人(悪い意味じゃないよ)ってのは抽象化になれてないんだろうな。
0191デフォルトの名無しさん2005/12/09(金) 06:10:21
普通の人がわかる抽象化ってのはデータ型とかくらいでしょう。
アルゴリズムの抽象化なんかは関数型言語をやったりLispを使い慣れたりしないと、
あまり理解できないか、少しわかっても難しく感じるだけで
有り難みやかっこよさを感じるところまでいかないと思う。
せいぜい高階関数いいね、止まりじゃないかな。
0192デフォルトの名無しさん2005/12/09(金) 06:14:09
抽象化ってのは突き詰めれば自然数みたいなプリミティブなところに行き着く。
先の見えない世界が延々と続いているような恐ろしいものを想像してる人が
たまにいるが、それは違うと思う。
0193デフォルトの名無しさん2005/12/09(金) 06:53:07
自然数は抽象化によって捨象される側じゃないか。
0194デフォルトの名無しさん2005/12/09(金) 10:11:00
抽象化を突き詰めるたら群とか環とかそっちに行くだろ。
0195デフォルトの名無しさん2005/12/09(金) 10:25:02
そして記号で記述できないほど抽象化されたシステムが誕生する。
0196デフォルトの名無しさん2005/12/09(金) 23:04:24
数学好きとLisp好きは相当被ってるよな。
Lisperにとっても誰にとっても抽象的なものってのは
難しいものだと思う。
だけど、一旦分かると格好良い!とか美しい!
と思うのがLisperや数学好きな奴だな。
0197デフォルトの名無しさん2005/12/09(金) 23:23:30
というより、抽象化されたレベルで単純な言語だから、暗記しなけりゃいけないことが
少なくて楽なんだよね。Perlなんて一見楽そうだけど、覚えておかなきゃいけないこと、
注意しなくちゃいけないことが不規則に多すぎて神経衰弱しちゃう。
0198デフォルトの名無しさん2005/12/10(土) 00:45:14
注意しなくちゃいけないことが不規則に多すぎて七並べしちゃう。
0199デフォルトの名無しさん2005/12/10(土) 14:11:55
注意しても無駄なことが不規則に多すぎてババ抜きしちゃう
0200デフォルトの名無しさん2005/12/11(日) 06:03:27
>>198-199


以下、何事もなかったよーにLispの話題ドゾー↓
0201デフォルトの名無しさん2005/12/11(日) 14:59:41
(let ((r (hoge)))
(foo)
r)
を楽に書けるマクロってあったりする?
0202デフォルトの名無しさん2005/12/11(日) 15:05:22
(prog1 (hoge) (foo))
0203デフォルトの名無しさん2005/12/11(日) 15:12:45
prog?のネーミングセンスってどうよ?
0204デフォルトの名無しさん2005/12/11(日) 15:22:33
きくまでも なかろうよ!
0205デフォルトの名無しさん2005/12/11(日) 19:39:50
もしWindowsのAPIみたいな名前だったら、と想像したら、
現状が素晴らしく思えてきます。
0206デフォルトの名無しさん2005/12/12(月) 03:11:35
http://www.cs.helsinki.fi/u/jesnellm/blog/archive/2005-12-11.html
SBCL on Windows

進展があったみたい
0207デフォルトの名無しさん2005/12/13(火) 00:33:56
おおすげー

で、どうやって動かすんだい?
C:\sbcl-win32-0.9.6-binaries>sbcl
fatal error encountered in SBCL pid 4032:
can't find core file

coreファイルあるのに読んでくれないや。

と思ったら
環境変数SBCL_HOMEを設定したら動いたよ
set SBCL_HOME=C:\sbcl-win32-0.9.6-binaries\

C:\sbcl-win32-0.9.6-binaries>sbcl
This is SBCL 0.9.6, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>;.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses. See the CREDITS and COPYING files in the
distribution for more information.
os_map: 3, 0x1000, 01000000, 0x1000.
os_map: 3, 0x2000, 05000000, 0x1000.
os_map: 3, 0x3000, 09000000, 0x17ce000.
Your Kitten of Death awaits!
*

これでいいのかい?
0208デフォルトの名無しさん2005/12/13(火) 01:00:27
つーか
sbcl --core sbcl.coreで逝けたよ

すげー
ちょー速い
こりゃネイティブコンパイルだね
Windowsでこんだけ速いのってフリーじゃなくね?
0209デフォルトの名無しさん2005/12/13(火) 23:33:33
SBCL ON Windows 確かに早い!
以前(ずっと昔)このスレで速さ比べが載ってて
CLISPのコンパイル後より
Petie Chez Scheme のVMが速いとあったが
SBCL ON Windows には足元にも及ばないぞ。
シェル上で動いてる、って事はVMじゃないのか?
0210デフォルトの名無しさん2005/12/14(水) 01:01:40
>>209
JITじゃね? と、いいかげんなことを言ってみるテスト。
0211デフォルトの名無しさん2005/12/14(水) 01:14:49
普通にネイティブコンパイルだよ… disassemble 試してみれ。
0212デフォルトの名無しさん2005/12/14(水) 05:47:04
SBCL は暗黙的にコンパイルしちゃうからね
http://www.sbcl.org/manual/Compiler-only-Implementation.html
0213デフォルトの名無しさん2005/12/14(水) 06:37:06
さっきはじめてgauche使ってlispを触ってみた。
今までは実行せずに「リスト遊び」と「SICP」を読んでただけ。
で、「コマンドライン引数に指定されたファイルを印字する」スクリプト
書いてみた。(関数名変かもしれんが気にしないでくれ)

(define ret_data (lambda (fname)
  (port->string-list (open-input-file fname))))

(define print_forlist
  (lambda (x)
    (if (not (null? x))
      (and
        (print (car x))
        (print_forlist (cdr x))
      ))))

(define main
  (lambda (env)
    (if (not (null? (cdr env)))
      (and
        (print_forlist (ret_data (car (cdr env))))
        (main (cdr env))
      ))))

gauche使いな偉い人達はどういう風に書くの?
0214デフォルトの名無しさん2005/12/14(水) 07:00:41
(define (main args)
  (for-each (lambda (f)
              (call-with-input-file f
                  (lambda (p)
                  (display (port->string p)))))
            (cdr args))
  0)
かな?
0215デフォルトの名無しさん2005/12/14(水) 07:02:51
(use file.util)
(define (print-file f) (print (file->string f)))
(define (main args) (for-each print-file args))
02162132005/12/14(水) 07:15:55
>>214-215
す すげー

displayとかfile.utilとか気になりまくりだ
さっそく調べてみよう。ありがとう。
02172152005/12/14(水) 08:09:52
> (define (main args) (for-each print-file args))
これは
(define (main args) (for-each print-file (cdr args)))
か。すまそ。
0218デフォルトの名無しさん2005/12/14(水) 08:28:56
文字列を介さないで copy-port すべき。
0219デフォルトの名無しさん2005/12/14(水) 09:23:29
(use file.filter)

(define (main args)
(for-each (cut file-filter copy-port :input <>)
(cdr args))
0)
0220デフォルトの名無しさん2005/12/14(水) 14:46:08
最後の0は何?
0221デフォルトの名無しさん2005/12/14(水) 16:48:56
優しさ
0222デフォルトの名無しさん2005/12/14(水) 17:30:09
srfi-22を見れ。
0223デフォルトの名無しさん2005/12/14(水) 18:10:46
>>22
こんなの決まってたんだね。
ttp://members.at.infoseek.co.jp/zzyyb/srfi/ja/srfi-22/srfi-22.html

#!は先頭行以外では別の意味に使っていいのかな。
0224デフォルトの名無しさん2005/12/16(金) 01:09:16
WiLiKiだかどこだかにSchemeコードを書くためのelispの設定を築き上げるための
叩き台をGaucheに含めると書いてあったと思うのですが、該当するコードが含まれて
いるのはどのリリースですか?CVS HEADも覗いているのですが見当たらないので
ご存知の方いましたら教えて下さい。
0225デフォルトの名無しさん2005/12/16(金) 01:15:59
>>224
Gauche-devel-jp ML あたりで聞くほうが良いと思う。
0226デフォルトの名無しさん2005/12/22(木) 08:27:26
PLT Scheme が v300 に上がったので一応貼り。
これが 300 系統で最初の正式リリースってことになるのかな。
win 版だと msvcr71.dll が必要になるそうなので注意。
http://download.plt-scheme.org/drscheme/
0227& ◆Q5hc3/kNG. 2005/12/23(金) 07:41:44
Chez Scheme(Petiteも含めて)も7.0aが出てますよ
DrScheme(PLT)のエディタで書いて、
Petite Chez で動かすのが一番かな?
・・・OSがWindowsですから。
0228デフォルトの名無しさん2005/12/23(金) 08:32:57
質問させてください。

(define a '(1 + 2))

として、

((car (cdr a)) 1 2)

として、3 が出力されるようにしたいのですが、(quote +) を
primitive の+に変換する方法はありますか?
little schemer のソースでは、全部 cond でスイッチケースしてた
んだけど・・・
0229デフォルトの名無しさん2005/12/23(金) 08:49:54
eval
02302282005/12/23(金) 09:13:11
>>229 THX!!
((eval (car (cdr a))) 1 2)
でうまくいきますた

0231デフォルトの名無しさん2005/12/23(金) 20:07:33
Y combinator って何に使うの?理屈はわかるんだけど
実用面ではどんな風に応用されてるのかさぱーりわからん
0232デフォルトの名無しさん2005/12/23(金) 20:29:38
そりゃ意味論の話だから。
0233デフォルトの名無しさん2005/12/23(金) 21:42:59
>>231
たまには意味あるんじゃないか?
名前空間を汚さずにラムダ式だけで計算できるから
実例は知らないけど…
0234デフォルトの名無しさん2005/12/23(金) 22:51:17
>>231
for-eachとかcall-with-*とかに再帰的な手続きを渡せたりとか。
0235デフォルトの名無しさん2005/12/24(土) 04:58:28
letrec使えばいいじゃん。
0236デフォルトの名無しさん2005/12/24(土) 12:45:41
>>231
コンパイラ作る時に使うとか
0237デフォルトの名無しさん2005/12/25(日) 02:45:47
http://luisguillermo.com/PL_ega.gif
ちょwwwww LISPwwwww
0238デフォルトの名無しさん2005/12/25(日) 03:19:10
>>237
何を表現してるのかさっぱりわからんwwwww
0239デフォルトの名無しさん2005/12/25(日) 12:52:44
http://www.yuasa.kuis.kyoto-u.ac.jp/~nobu/study/palm/chap2.html
ここの2.6に書いてある、ダイナミックヒープ中の一時的なビットベクタを使う
とはどういう意味なんでしょうか。
どこがマークされたか保存しておいて、スイープの時に照し合わせるんでしょうか?
だとしたら滅茶苦茶時間かかると思うんですけど。

リストにネイティブなポインタを使うと下位2ビットしか使えないんですが
そこをGCのフラグに使うのが一般的なんでしょうか?

それともポインタの代わりに配列のインデックスを使った方がいいんでしょうか?
これのやり方がいまいち良く分かりません。
0240デフォルトの名無しさん2005/12/25(日) 13:12:05
対象ポインタ中にmark bitを取るとmarkするだけでそのページが
dirtyになるから、incremental gcとかが面倒にならんかな。
まあ、write barrierの実装方法にもよるし、ケースバイケースだね。
0241デフォルトの名無しさん2005/12/25(日) 21:45:08
>>237
とりあえずBASICは前科者

あとFORTRANは怒らせないほうがいい
0242デフォルトの名無しさん2005/12/25(日) 22:11:06
>>239
src/store.c読め。
markBitという変数がビットベクタ。
わざわざLispMeのソース持ってきて調べちゃったじゃないか。
ちなみにセルはインデックスになっていた。
これのメリットはフラグビットが多く取れる事、永続化する際に
アドレス変換しなくて良い(そのままfwrite/fread可)といった点。
0243デフォルトの名無しさん2005/12/25(日) 23:22:53
>>242
読まずに質問してすいません。
マークビットにインデックスで直接アクセスするので、余計な時間はかからないんですね。
フラグビットが多く取れることやダンプが簡単なことはとっても魅力的なんですけど
メモリの無駄が多いことと、いっぱいになったときに reallocするのが重そうなので
なんだかためらってしまいます。
reallocしない方法も考えられますが、生きてるセルの間が大きくなったりしたら
困る気がします。
0244デフォルトの名無しさん2005/12/25(日) 23:30:15
ヒープが小さいんだからたいして困らん。
0245デフォルトの名無しさん2005/12/25(日) 23:43:29
>>244
それは Palmの場合ですよね。
LispMeではヒープのサイズは固定ですが、一般にはヒープサイズを可変にした方が
いいと思ったので。
言葉足らずですいません。
0246デフォルトの名無しさん2005/12/30(金) 06:23:00
CL でも Scheme でもないけど、xlispstat の本が出たみたい

http://www.kohgakusha.co.jp/books/detail/4-7775-1180-4
0247デフォルトの名無しさん2005/12/30(金) 13:45:12
うっ、微妙だな…目次みた感じだと、まだ統計を習ってない(かつ R とかにで
あってない)人の入門向けってとこかな。高校生くらいには丁度いいのかも。

まぁ、せっかくここまで揃えた Lisp 本コレクションが欠けるのも悔しいので
買ってしまうんだけどね…。
0248デフォルトの名無しさん2005/12/30(金) 18:50:02
高校生ですが、その本の
「計算機科学の方面では『λ算法』とかいうものがあると聞きますが、
詳しいことは筆者もよく知りません」
という記述はどうかと思いました。
0249デフォルトの名無しさん2005/12/30(金) 18:57:45
CS 専攻じゃなければ名前だけって人も多いだろう。
計算モデルを知らなくても使えるからいいじゃん。
無意味にしったかぶりするよりは好印象。
0250デフォルトの名無しさん2005/12/30(金) 22:46:19
でも本に書くなら調べて簡単な註釈なりリファレンスなり示しとけと。
0251デフォルトの名無しさん2005/12/31(土) 01:51:57
工学社の本なら「筆者もよく知りません(笑」でなかっただけマシだろ。
あそこパソ通時代のノリそのままの半可通本が多いわけだし
0252デフォルトの名無しさん2005/12/31(土) 09:59:50
CS専攻(だった。10年前)でもλ算法知りませんが何か?
■ このスレッドは過去ログ倉庫に格納されています