CommonLisp Scheme Part12
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
NGNGPart1: 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/
関連リンクは>>2-10あたり
0951デフォルトの名無しさん
2005/04/24(日) 14:06:480952デフォルトの名無しさん
2005/04/24(日) 18:05:00faslは見つけたんだが、require出来ん。
Trialでは無理なのかな?
これでjavaコード全部書いてやろうと思ってたんだが。
0953デフォルトの名無しさん
2005/04/25(月) 23:29:380954デフォルトの名無しさん
2005/04/26(火) 00:54:26>>946
>もし混同していたのなら、これを機に復習してくれ。
なるほど。ご指摘ありがとうございます。
>some-operationを変数名だとみなしたら手続き呼び出しだし、
> 構文キーワード名だとみなしたらマクロ展開だ。
結局、手続きとマクロ展開とはつくられたときから全く別の
ものであり、参照のためにそれぞれ変数名や構文キーワードに
関係づける際に、それぞれdefineとdefine-syntaxを使う、と
理解しました。
ただし、
>「これらは同じ名前空間で管理される(別の言い方では同じ
>スコープ規則に従う)
わけですね。
そうすると、マクロと手続きとは並列的な関係にあるオブジェクトであって、
>>946さんは婉曲に
>そういった訳で、940でのあなたの理解は大まかには正しいということに
>なる。
なんて書いてくださいましたが、私が>>939-940で納得していた
「Cプリプロセッサ的解釈」はちょっと違いますね。
compiler(およびそれと整合的なシステム)は、実行時に
マクロ展開を選択的に優先して実行するようなシステムだと
思えばいい、ということで、今度こそ納得できた気がします。
0955デフォルトの名無しさん
2005/04/26(火) 01:03:46ちなみにcompilerそのものの場合には
コンパイル時にマクロ展開するので、
最後のくだりの中で
>実行時に
が不要であることはわかってます。
0956デフォルトの名無しさん
2005/04/26(火) 01:08:10キミの理解はあってると思うけど、
キミの文章は色々不要な事を言い出しちゃってて、
コミュニケーションに難がある、と思う。
このような文章を書くあなたは学生さんだと思うが。
テストの回答で、余計な事書くと減点されるって知ってるよね?
今の君のコミュニケーションは、正にそれ。くどい。
0957デフォルトの名無しさん
2005/04/26(火) 01:10:05あるいは、
正解わからずに、解答欄に三つも四つも解を書いて、
数撃ちゃ当たるだろう、という傲慢な態度が見え隠れしている。
0958デフォルトの名無しさん
2005/04/26(火) 01:15:54>>956-957
勉強します。
0960デフォルトの名無しさん
2005/04/26(火) 23:12:08Vielen Dank!
0961デフォルトの名無しさん
2005/04/27(水) 23:44:00もつろんSchemeでさ
0962デフォルトの名無しさん
2005/04/28(木) 10:27:230963デフォルトの名無しさん
2005/04/28(木) 12:50:350964デフォルトの名無しさん
2005/04/28(木) 21:49:260965デフォルトの名無しさん
2005/05/04(水) 22:29:16Schemeでマクロを使わず、オブジェクト指向の継承をやるにはどうすればいいですか?
(define (make-object x y)
(let ((v (make-vector (* x y) 0)))
(lambda (method . args)
(cond
((eq? method 'print)
(display v)(newline))
((eq? method 'set!)
(set! v (car args)))))))
で内部にx,y,vの変数を持つオブジェクトが作れるわけですが、
Javaの継承みたいに変数やメソッドを増やすとか、メソッドのオーバライドってできますか?
0966デフォルトの名無しさん
2005/05/04(水) 22:37:30まずは「どういうセマンティクスなのか」だろ。あとは内部表現次第でどうとでもなる。
マクロは、要は見た目を整えてるだけなんだから、マクロを使いたくなければ
それが展開された形で長々ズラズラと書き連ねればいいだけ。
0967デフォルトの名無しさん
2005/05/04(水) 23:52:44その方法だと
(define (make-object x y . super)
(set! super (if (pair? super) (car super)
(lambda args (error "Unknown method " args))))
:(略)
(else (apply super (list* method args]
という風に修正してやれば継承ぐらいならできるんじゃね?
しかし、つらつらeq?でシンボルと比較しながらメッセージディスパッチ
してたんでは実験程度にしか使いたくないよな。
せめてCでのswitch程度の方法が欲しい。
0968デフォルトの名無しさん
2005/05/05(木) 00:19:05> せめてCでのswitch程度の方法が欲しい。
case
0969デフォルトの名無しさん
2005/05/05(木) 00:26:08caseもifに変換するマクロって場合が多いし、
そういうのは結局eq?で比較してる。
シンボルからテーブル引くような事で分岐さす処理系あるかなあ?
0970デフォルトの名無しさん
2005/05/05(木) 00:42:47> シンボルからテーブル引くような事で分岐さす処理系あるかなあ?
具体的にどの処理系でやってるという情報は持っていないが、言語仕様上 case は
テーブル引きへコンパイルできるように設計されているように見える。
0971デフォルトの名無しさん
2005/05/05(木) 00:54:30プロトタイプベースが使えるやつ。
前見たときは保守もされてないし、
インタプリタだろうから速度は全く期待できない。
まあ965みたいなの1から作るよりかはマシかも。
まともに使いたいならSTkがいいんじゃないかな。
CLOS風になるけど。
0972965
2005/05/05(木) 11:32:21継承までやると簡単な方法はないようですね。
BOSとかソース読んで見ますわ。
0973デフォルトの名無しさん
2005/05/06(金) 04:06:41んーいや、難しいっていうか面倒。マクロ使わないと。
>>966 も言っているけれど、要はマクロ使わない=マクロの展開形をいちいち書く、なので。
プロトタイプ型でよかったらこんなのがある。簡潔なので目を通してみては。
ttp://www.ping.de/~flori/flott/exe/session/project/scheme/poops
0974デフォルトの名無しさん
2005/05/07(土) 03:06:48http://tabesugi.net/memo/2005/51.html#051425
言われてみれば,なるほどなぁ,である.
0975デフォルトの名無しさん
2005/05/07(土) 05:09:45(defun gl-define-primitive (mode func)
(unwind-protect (progn (glBegin mode)
(funcall func))
(glEnd)))
(gl-define-primitive GL_POLYGON
(lambda () ...))
こう書くかなあ。てことはPythonでも
def gl_define_primitive(mode, func):
try:
glBegin(mode);
func();
finally:
glEndEnd();
gl_define_primitive(GL_POLYGON, lambda : ...);
こんな感じでいけるんじゃないの?
0976デフォルトの名無しさん
2005/05/07(土) 05:32:08(call-with-... ) という形の高階関数と (with-... ) という形のマクロを同時に用意するのが普通でしょ
0977デフォルトの名無しさん
2005/05/07(土) 06:19:23でも Python って将来的に lambda なくなるんじゃなかったっけ?
block 構文を導入するとか何とかって話もどっかで見た記憶があるけど。
なんか微妙臭かったよなあ。
lambda は必要以上に何でもありすぎるって思想なのかね。
0978デフォルトの名無しさん
2005/05/08(日) 05:34:59初心者には意味不明だという意見が多かっただけだったり。
JavaScriptみたくfunctionにでもすりゃよかったのにね。
もちろんセマンティクスも。
0979デフォルトの名無しさん
2005/05/08(日) 09:17:44Lispちょっと知ってて、その後Python入ったクチだけど。
Pythonのlambda中途半端すぎ。
どのくらい中途半端かというとN88-BASICのDEF FN並。
あれが未だに残ってることがよく解らん。
Pythonは好きなんだけどねぇ。
0980デフォルトの名無しさん
2005/05/10(火) 11:34:26950超えると,いつ落ちてもおかしくないし.
0981デフォルトの名無しさん
2005/05/11(水) 03:01:06テンプレに付け加えることってなんかあるかね。
0982デフォルトの名無しさん
2005/05/11(水) 04:11:27>>944は入れてもいいかも
Javaで書いたLispなどのリンク集
http://home.comcast.net/~bc19191/blog/040627.html
0983デフォルトの名無しさん
2005/05/11(水) 11:16:49時間ができたら,過去スレのトピックをまとめたいと思っているので.
------------------------------------------------------
35 :flatline@Vim%Chalice ◆r6EONKKhcc :04/02/03 19:10
#http://www.komaba.utmc.or.jp/~flatline/wiliki.cgi
いつまで存在するか保証はしません
0984デフォルトの名無しさん
2005/05/11(水) 19:15:590985デフォルトの名無しさん
2005/05/12(木) 09:56:01(define !
(lambda (n)
(if (= n 1)
1
(* n (! (- n 1))))))
は、末尾再帰になっているのでしょうか?
末尾部分に!だけでなく、*があるけれども、という意味です。
初歩的な質問で申し訳ない。
0986デフォルトの名無しさん
2005/05/12(木) 10:15:28(define (! n)
(let loop ((n n) (r 1))
(if (= n 1) r (loop (- n 1) (* r n)))))
0987デフォルトの名無しさん
2005/05/12(木) 10:15:45簡単に答えると、末尾再帰になってないです。
*を計算する為に(! (- n 1))から戻ってきてもらう必要があるからです。
0988末尾再帰版
2005/05/12(木) 10:28:21(lambda (n) (fact-tailrecursion n 1)) )
(define fact-tailrecursion
(lambda (n prod)
(if (= n 1)
prod
(fact-tailrecursion (- n 1) (* prod n)) ) ) )
0989デフォルトの名無しさん
2005/05/12(木) 10:42:33(lambda (n)
(letrec ((fact-tailrecursion
(lambda (n prod)
(if (= n 1)
prod
(fact-tailrecursion (- n 1) (* prod n)) ) ) ))
(fact-tailrecursion n 1) ) )
上記の末尾再帰は、下記のiterationと等価。
(define fact-iteration
(lambda (n)
(do ((n n (- n 1))
(prod 1 (* prod n)) )
((= n 1) prod) ) ) )
0990985
2005/05/12(木) 20:05:26末尾再帰ならSchemeで内部的にiterationに変換されて処理
されるはずなのに >>985 のコードでnを大きくするとStack
Overflowエラーが出たのでおたずねしました。
処理系としては、985のようなコードを内部的にiterationに
変換したりせず、忠実にコードのアルゴリズムに従うほうが
正しいのでしょうね。
ちゅうか、そういう変換が常に可能とは限らない、か。
0991デフォルトの名無しさん
2005/05/12(木) 20:08:58あの頃の自分はなんてアホだったんだろうって
0992985
2005/05/12(木) 20:11:03ううむ。返す言葉もない。
0993デフォルトの名無しさん
2005/05/12(木) 20:21:100994デフォルトの名無しさん
2005/05/12(木) 20:44:230995デフォルトの名無しさん
2005/05/12(木) 21:05:092分くれ。
駄目だったら何も書かない。
0996デフォルトの名無しさん
2005/05/12(木) 21:33:40俺は何もしない。
0997デフォルトの名無しさん
2005/05/12(木) 21:51:17CommonLisp Scheme Part13
http://pc8.2ch.net/test/read.cgi/tech/1115901841/l50
0998デフォルトの名無しさん
2005/05/12(木) 22:06:380999デフォルトの名無しさん
2005/05/12(木) 22:35:10(display "ume"))
1000デフォルトの名無しさん
2005/05/12(木) 22:45:3010011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。