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

CommonLisp Scheme Part12

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさんNGNG
過去スレ
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/

関連リンクは>>2-10あたり
0951デフォルトの名無しさん2005/04/24(日) 14:06:48
JiL? 6のトライアル版でも使ってんの?
0952デフォルトの名無しさん2005/04/24(日) 18:05:00
>951
faslは見つけたんだが、require出来ん。
Trialでは無理なのかな?
これでjavaコード全部書いてやろうと思ってたんだが。
0953デフォルトの名無しさん2005/04/25(月) 23:29:38
トライアル版持ってないから力になれない。Franz Inc.に直接問い合わせてみれば?
0954デフォルトの名無しさん2005/04/26(火) 00:54:26
921です

>>946
>もし混同していたのなら、これを機に復習してくれ。
なるほど。ご指摘ありがとうございます。

>some-operationを変数名だとみなしたら手続き呼び出しだし、
> 構文キーワード名だとみなしたらマクロ展開だ。
結局、手続きとマクロ展開とはつくられたときから全く別の
ものであり、参照のためにそれぞれ変数名や構文キーワードに
関係づける際に、それぞれdefineとdefine-syntaxを使う、と
理解しました。
ただし、
>「これらは同じ名前空間で管理される(別の言い方では同じ
>スコープ規則に従う)
わけですね。

そうすると、マクロと手続きとは並列的な関係にあるオブジェクトであって、
>>946さんは婉曲に
>そういった訳で、940でのあなたの理解は大まかには正しいということに
>なる。
なんて書いてくださいましたが、私が>>939-940で納得していた
「Cプリプロセッサ的解釈」はちょっと違いますね。

compiler(およびそれと整合的なシステム)は、実行時に
マクロ展開を選択的に優先して実行するようなシステムだと
思えばいい、ということで、今度こそ納得できた気がします。
0955デフォルトの名無しさん2005/04/26(火) 01:03:46
921です。補足
ちなみにcompilerそのものの場合には
コンパイル時にマクロ展開するので、
最後のくだりの中で
>実行時に
が不要であることはわかってます。
0956デフォルトの名無しさん2005/04/26(火) 01:08:10
>>954-955
キミの理解はあってると思うけど、
キミの文章は色々不要な事を言い出しちゃってて、
コミュニケーションに難がある、と思う。

このような文章を書くあなたは学生さんだと思うが。
テストの回答で、余計な事書くと減点されるって知ってるよね?
今の君のコミュニケーションは、正にそれ。くどい。
0957デフォルトの名無しさん2005/04/26(火) 01:10:05
くどい=回りくどい

あるいは、

正解わからずに、解答欄に三つも四つも解を書いて、
数撃ちゃ当たるだろう、という傲慢な態度が見え隠れしている。
0958デフォルトの名無しさん2005/04/26(火) 01:15:54
921です
>>956-957
勉強します。
09599462005/04/26(火) 11:40:51
>>954
それでOKかと。

923とその背景を説明してる924はよく出来てると思うので、迷ったら読み
返すといいかもしれない。
0960デフォルトの名無しさん2005/04/26(火) 23:12:08
>>959
Vielen Dank!
0961デフォルトの名無しさん2005/04/27(水) 23:44:00
CPSにコンパイルする処理系ないですか
もつろんSchemeでさ
0962デフォルトの名無しさん2005/04/28(木) 10:27:23
rhizome/pi "完全なCPSによる実装である"らしい。
0963デフォルトの名無しさん2005/04/28(木) 12:50:35
ChickenもCPSだべ。
0964デフォルトの名無しさん2005/04/28(木) 21:49:26
あろがと
0965デフォルトの名無しさん2005/05/04(水) 22:29:16
単発初心者質問、すみません。
Schemeでマクロを使わず、オブジェクト指向の継承をやるにはどうすればいいですか?
(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
>>965
まずは「どういうセマンティクスなのか」だろ。あとは内部表現次第でどうとでもなる。
マクロは、要は見た目を整えてるだけなんだから、マクロを使いたくなければ
それが展開された形で長々ズラズラと書き連ねればいいだけ。
0967デフォルトの名無しさん2005/05/04(水) 23:52:44
>>965
その方法だと
(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
>>967
> せめてCでのswitch程度の方法が欲しい。

case
0969デフォルトの名無しさん2005/05/05(木) 00:26:08
>>968
caseもifに変換するマクロって場合が多いし、
そういうのは結局eq?で比較してる。
シンボルからテーブル引くような事で分岐さす処理系あるかなあ?
0970デフォルトの名無しさん2005/05/05(木) 00:42:47
>>969
> シンボルからテーブル引くような事で分岐さす処理系あるかなあ?

具体的にどの処理系でやってるという情報は持っていないが、言語仕様上 case は
テーブル引きへコンパイルできるように設計されているように見える。
0971デフォルトの名無しさん2005/05/05(木) 00:54:30
OSchemeだっけ?
プロトタイプベースが使えるやつ。
前見たときは保守もされてないし、
インタプリタだろうから速度は全く期待できない。
まあ965みたいなの1から作るよりかはマシかも。

まともに使いたいならSTkがいいんじゃないかな。
CLOS風になるけど。
09729652005/05/05(木) 11:32:21
みなさん、どうもです。
継承までやると簡単な方法はないようですね。
BOSとかソース読んで見ますわ。
0973デフォルトの名無しさん2005/05/06(金) 04:06:41
>>972
んーいや、難しいっていうか面倒。マクロ使わないと。
>>966 も言っているけれど、要はマクロ使わない=マクロの展開形をいちいち書く、なので。

プロトタイプ型でよかったらこんなのがある。簡潔なので目を通してみては。
ttp://www.ping.de/~flori/flott/exe/session/project/scheme/poops
0974デフォルトの名無しさん2005/05/07(土) 03:06:48
話は変わるが,マクロが安全なプログラミングに役立つ,というお話.
http://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
毎回そこで lambda を書くのが手間だし読みづらいから、
(call-with-... ) という形の高階関数と (with-... ) という形のマクロを同時に用意するのが普通でしょ
0977デフォルトの名無しさん2005/05/07(土) 06:19:23
まあ、ブロック渡したいだけなら高階関数で何とかなるわな。

でも Python って将来的に lambda なくなるんじゃなかったっけ?
block 構文を導入するとか何とかって話もどっかで見た記憶があるけど。
なんか微妙臭かったよなあ。
lambda は必要以上に何でもありすぎるって思想なのかね。
0978デフォルトの名無しさん2005/05/08(日) 05:34:59
どうやらpythonの思想では、単にlambdaというキーワードが、
初心者には意味不明だという意見が多かっただけだったり。
JavaScriptみたくfunctionにでもすりゃよかったのにね。
もちろんセマンティクスも。
0979デフォルトの名無しさん2005/05/08(日) 09:17:44
>>977
Lispちょっと知ってて、その後Python入ったクチだけど。
Pythonのlambda中途半端すぎ。
どのくらい中途半端かというとN88-BASICのDEF FN並。
あれが未だに残ってることがよく解らん。
Pythonは好きなんだけどねぇ。
0980デフォルトの名無しさん2005/05/10(火) 11:34:26
保守.そろそろ次スレがあってもいいかな?
950超えると,いつ落ちてもおかしくないし.
0981デフォルトの名無しさん2005/05/11(水) 03:01:06
まあ、今の速度なら 990 でも充分かな。
テンプレに付け加えることってなんかあるかね。
0982デフォルトの名無しさん2005/05/11(水) 04:11:27
>>981
>>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:59
確かに、過去スレのインタプリタ/コンパイラ自作系の話題がまとまっていると嬉しいかもね
0985デフォルトの名無しさん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
>>985
簡単に答えると、末尾再帰になってないです。
*を計算する為に(! (- n 1))から戻ってきてもらう必要があるからです。
0988末尾再帰版2005/05/12(木) 10:28:21
(define !
 (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
(define fact
 (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) ) ) )
09909852005/05/12(木) 20:05:26
やはり末尾再帰ではないわけですね。
末尾再帰ならSchemeで内部的にiterationに変換されて処理
されるはずなのに >>985 のコードでnを大きくするとStack
Overflowエラーが出たのでおたずねしました。

処理系としては、985のようなコードを内部的にiterationに
変換したりせず、忠実にコードのアルゴリズムに従うほうが
正しいのでしょうね。
ちゅうか、そういう変換が常に可能とは限らない、か。
0991デフォルトの名無しさん2005/05/12(木) 20:08:58
そのうち見りゃすぐ判るようになるよ
あの頃の自分はなんてアホだったんだろうって
09929852005/05/12(木) 20:11:03
>>991
ううむ。返す言葉もない。
0993デフォルトの名無しさん2005/05/12(木) 20:21:10
コンテクストを理解できないと末尾再帰を理解するのは難しい
0994デフォルトの名無しさん2005/05/12(木) 20:44:23
誰か、新スレたてて
0995デフォルトの名無しさん2005/05/12(木) 21:05:09
試してみるわ。
2分くれ。
駄目だったら何も書かない。
0996デフォルトの名無しさん2005/05/12(木) 21:33:40
駄目だったか。
俺は何もしない。
0997デフォルトの名無しさん2005/05/12(木) 21:51:17
さて、新スレであります

CommonLisp Scheme Part13
http://pc8.2ch.net/test/read.cgi/tech/1115901841/l50
0998デフォルトの名無しさん2005/05/12(木) 22:06:38
(ume)
0999デフォルトの名無しさん2005/05/12(木) 22:35:10
(define (ume)
(display "ume"))
1000デフォルトの名無しさん2005/05/12(木) 22:45:30
1000だったらCLtL3が出る。
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。