1 名前:デフォルトの名無しさん mailto:sage [04/08/02 23:13] 過去スレ Part1: piza2.2ch.net/tech/kako/987/987169286.html Part2: pc.2ch.net/tech/kako/1002/10025/1002584344.html Part3: pc.2ch.net/tech/kako/1008/10082/1008220265.html Part4: pc.2ch.net/tech/kako/1016/10162/1016211619.html Part5: pc3.2ch.net/tech/kako/1023/10230/1023091882.html Part6: pc3.2ch.net/tech/kako/1031/10315/1031560687.html Part7: ruku.qp.tc/dat2ch/0311/20/1042167213.html Part8: pc2.2ch.net/tech/kako/1058/10582/1058263391.html Part9: pc2.2ch.net/test/read.cgi/tech/1069594582/ Part10: pc5.2ch.net/test/read.cgi/tech/1075630259/ 関連リンクは>>2-10 あたり
641 名前:デフォルトの名無しさん mailto:sage [04/10/06 14:10:36] >>638 結局 (append result (foo-entry result dir (car files))) で ディレクトリの深さ分スタック使うのだから 普通に再帰で書いたのに比べて何もメリットがなくない? -- (define (foo l) (if (string? l) (list l) (map (lambda (x) (string-append (car l) "/" x)) (cons "" (apply append (map foo (cdr l)))))))
642 名前:デフォルトの名無しさん mailto:sage [04/10/06 14:14:09] スペースの変換を忘れてたorz (define (foo l) (if (string? l) (list l) (map (lambda (x) (string-append (car l) "/" x)) (cons "" (apply append (map foo (cdr l)))))))
643 名前:631 mailto:sage [04/10/06 23:21:02] >>639 >>640 確かにそうですね。 >>641 メリットは特にないですね。 高階関数に馴染みがなくてあれ以外の実装を 思いつかなかったというのが真相だったりします。 やろうと思えば引数を増やして全て末尾再帰にできるかも しれませんが、やたら読みにくいソースになるでしょうね。
644 名前:デフォルトの名無しさん mailto:sage [04/10/07 23:52:58] 埋め込み言語の例というのが見てみたいんだけど, onlisp 以外にもなにかありませんか?
645 名前:デフォルトの名無しさん mailto:sage [04/10/08 00:21:31] >>644 これとか? ttp://www.shiro.dreamhost.com/scheme/vault/escm.html これはちょっと埋め込みとはちがうけど、S 式で HTML を書くというアプローチ ttp://cl-www.msi.co.jp/solutions/knowledge/ ttp://cl-www.msi.co.jp/solutions/knowledge/src
646 名前:645 mailto:sage [04/10/08 00:28:51] あ、ちがった、埋め込み言語ってそういう意味じゃないのね。 たとえば Lisp/Scheme で書かれた LR パーザジェネレータとか。 腐るほどありそうだな。今、さっと見つかったのはこんなの。 ttp://www.informatik.uni-freiburg.de/proglang/software/essence/doc/html/essence.html
647 名前:644 mailto:sage [04/10/08 01:00:10] >>646 ども. たしかに数はたくさんありそうなんですけど,うまく見つけられなくて. ここのリンク先のはソースもあるんで, schemeは使ったこと無いけど,本とにらめっこしながら読んでみます. 他にもいい例があればお願いします.
648 名前:デフォルトの名無しさん mailto:sage [04/10/08 01:13:04] LISPはちょっとかじった程度でよくわかってないのですが 質問させてください たとえば、Cでネットワークゲームを作るときに なんか処理したかったら、適当なデータ構造に 情報を埋め込んで送信して、受信側でデータを解釈→処理 とかなりますよね LISPのevalとかを使うと、プログラム本体がデータ構造もかねるから 動作させたい処理のS式をそのままリテラルとして送信して eval させて動作させてしまう、とか出来るんでしょうかね?
649 名前:デフォルトの名無しさん mailto:sage [04/10/08 01:54:37] Lisp に限らず、eval のある言語ならだいたいできるんじゃないのかな。
650 名前:デフォルトの名無しさん mailto:sage [04/10/08 02:08:45] eval is evil.
651 名前:デフォルトの名無しさん mailto:sage [04/10/08 07:33:19] でもそういう設計はよくないけどな。 ネットワーク越し(じゃなくても)で通信するときに相手から送られてくるものを 信用するというのは危険すぎる、ということを歴史は教えている。
652 名前:デフォルトの名無しさん mailto:sage [04/10/08 08:02:59] >>651 アプレットやSOAPと基本は同じでしょ? 用はセキュリティーの確保の仕方の問題だと思われ。
653 名前:デフォルトの名無しさん mailto:sage [04/10/08 09:32:56] >>648 evalも結局のところは、「受信側でデータを解釈→処理」してるだけ なんだけどね。「解釈→処理」の処理系が最初から用意されていると いうだけで。 汎用性が高い、本体と同じ言語で書ける、といった側面はそのまま メリットにもデメリットにもなるし。
654 名前:デフォルトの名無しさん mailto:sage [04/10/08 10:17:45] scheme の eval みたいに環境を指定できれば比較的手軽にセキュリティー確保できるね
655 名前:デフォルトの名無しさん mailto:sage [04/10/08 11:19:34] shiro さんの2004.10.07の文章で、 www.shiro.dreamhost.com/scheme/wiliki/wiliki2.cgi?Shiro 以前から Lisper としての適性に関係があるとして、時々話題になっている、 アスペルガー症候群・高機能自閉症の、簡易テストが紹介されている。 「平均は16.4ポイントで、 32ポイント以上のうち8割はautism related disorder だそうだ。私(shiroさん)は31ポイントだった」そうです。 www.wired.com/wired/archive/9.12/aqtest.html 自分でやってみたところ、慎重に回答したのに38ポイントだった。 しかし自分はヘタレ Schemer。ぜんぜんLisp能力に比例して無いじゃん…。
656 名前:デフォルトの名無しさん mailto:sage [04/10/08 12:14:36] このテスト、人間関係が苦手である、うまく行っていないという項目が多いな。 だから、 ・ Lisper として能力が高い →・他言語のプログラマとしても成功する →・周囲から尊敬を集める →・人間関係が良くなる →・このテストのスコアが下がる Lisper としての能力と、このテストのスコアには、こういう負の相関が 働いている気がするのだが。
657 名前:デフォルトの名無しさん mailto:sage [04/10/08 12:48:17] 心理テストに気休め以上の意味があるとは思わん。
658 名前:デフォルトの名無しさん mailto:sage [04/10/08 17:18:30] >>655 辞書引きながらやってみた。 24ポイント。 微妙に低くてチョトくやしい (w
659 名前:655 mailto:sage [04/10/08 18:40:48] 念のために言うけど、このテストはまったく当てにならないと思うよ。 『on Lisp』をいつまでも読み進められない私がそれは保証できる。 だけどなんとなく、ほかの人の点数も知りたいのう。 冷やかしでトライしてくれた人、他にもいたら書き込んでください。 おながいします。
660 名前:デフォルトの名無しさん mailto:sage [04/10/08 19:26:09] 34。Lisp は好きだけど能力があるのかどうか……
661 名前:デフォルトの名無しさん mailto:sage [04/10/08 19:27:47] emacs で動く scheme 実行環境はありますか?
662 名前:デフォルトの名無しさん mailto:sage [04/10/08 19:51:11] >>659 自閉症スペクトラムのテストとしてはそこそこいい出来だと思うが。 親戚男性自閉症率高の趣味の Schemer で、40点。非人間的なものへ のこだわりと認識能力で点数が出て、直接 Lisp と関係があるわけ じゃないから。 >>661 M-x run-scheme では不満?
663 名前:655 mailto:sage [04/10/08 20:08:14] >>662 自閉症スペクトラムについては、まあ同意です。 自閉症には私も興味を持って、いろいろ調べてみたことがあります。 「当てにならない」と書いたのは、Lisper としての能力と、このテストの関連。 >>661 思い切って guile-emacs を導入するのはどうだろう? 使ったことはないけれど。
664 名前:デフォルトの名無しさん mailto:sage [04/10/08 20:08:44] >>656 ・ Lisper として能力が高い →・でも別にプログラマとしては成功しない →・周囲からも尊敬は集めない →・人間関係も良くならない →・このテストのスコアが上がる Lisper としての能力と、このテストのスコアには、こういう正の相関が(以下略)
665 名前:デフォルトの名無しさん mailto:sage [04/10/08 20:41:18] 感O しないで AC になれなかったので, せめて lisp で AC に近づこうとしています. これが妥当な lisp の用途ということでよろしいでしょうか?
666 名前:655 mailto:sage [04/10/08 21:32:01] それにしても、当然のように「自閉症スペクトラム」という言葉を使う人も、 やはりこのスレにはいましたか。ポイントも私より上だし。 >>664 私はプログラマとして才能がなかったんで、Lisp を覚えて「普通の奴らに差をつけ」 ようとしたんだけど、Lisper としても才能がなかった。 しかも副作用として、それまでは面白かった Java がつまらなくなってしまった。 自分はダメだったけど、Lisperとして成功できる人なら、他の言語でも成功するのかと 思っていたのに、まさか逆だというのですか?! >>665 私は感電と Lisp の経験者だけど、現状は前述のとおり。 でもいいのだ。Lisp は面白いから。 きっと Lisp は、ただ面白いためにあるのだ。 才能はさておき、こういうことに興味を持つことには、自閉症傾向は関係が あるような気がしなくもない。
667 名前:デフォルトの名無しさん mailto:sage [04/10/08 21:59:47] ACよりもSEXPになりたい。
668 名前:デフォルトの名無しさん mailto:sage [04/10/08 22:13:30] この自閉症どもが
669 名前:デフォルトの名無しさん mailto:sage [04/10/08 23:13:31] >>667 sexp が t になるには 8 歳までに (ry
670 名前:デフォルトの名無しさん mailto:sage [04/10/08 23:36:39] ∩ ( ゚∀゚)彡 sexp!sexp! ⊂彡
671 名前:デフォルトの名無しさん mailto:sage [04/10/09 00:47:43] Lispの才能と体重は正比例の関係があるらしいよ
672 名前:デフォルトの名無しさん mailto:sage [04/10/09 00:51:02] >>671 デブヲタ発見。
673 名前:デフォルトの名無しさん mailto:sage [04/10/09 01:16:40] sexpと体重は正比例の関係があるらしいよ
674 名前:デフォルトの名無しさん [04/10/09 09:57:46] 「on Lisp」の日本語版があるって聞いたんだがその本の日本語名ってなに? 'on' も 'Lisp'も一般的すぎて検索してもよくわからない・・・ 本じゃなくてどこかのWebページなのか?
675 名前:デフォルトの名無しさん mailto:sage [04/10/09 10:00:05] >>674 >>544
676 名前:デフォルトの名無しさん mailto:sage [04/10/09 10:00:29] >>674 >>544
677 名前:674 mailto:sage [04/10/09 10:14:44] おお、サンクス!! スレの真ん中あたりにあったのか・・・ #こう書くべきかな? (thanx 675 676)
678 名前:デフォルトの名無しさん mailto:sage [04/10/09 11:11:51] >>671 なんとなく,才能は体重の逆数にあるような. 0 Kgで発散しますが,CLHS には inf が無いのでちょっと分かりません.
679 名前:デフォルトの名無しさん mailto:sage [04/10/09 11:55:07] Gauche(ver 0.8.1)でGauche-gtk(ver 0.4.1) やってるんですけど、 (gdk-font-load)が未定義の値って言われちゃいます。 なんで?
680 名前:デフォルトの名無しさん mailto:sage [04/10/09 11:55:38] まだ4kgもないうちの甥っ子は天性のlisperなのかしら
681 名前:デフォルトの名無しさん mailto:sage [04/10/09 13:47:02] 大人になると、才能は錆付くんだよ。
682 名前:デフォルトの名無しさん mailto:sage [04/10/09 17:12:00] SRFI40: A Library of Streamsを読んでて違和感を感じたので、それを文に してみた。schemeのプロミスの話。感想きかせて。 members3.jcom.home.ne.jp/t-yam/promiseless.html
683 名前:デフォルトの名無しさん mailto:sage [04/10/09 17:25:23] ブラクラ?
684 名前:デフォルトの名無しさん mailto:sage [04/10/09 17:26:36] >>682 いいんじゃない? そもそもR5RSはdelayが特定の「プロミス型」を 返すことを要求していないから、そこで必要な時に必要なだけforceされる 処理系も許されてるんじゃないかな。(delayの返す値は「プロミスである」 とされているだけで、それが具体的に何なのかは未定義。さらに、 「プロミスとそれがforceされた値とを区別することは規格内ではできない」 とされているから、プロミスなんてユーザには見えない、っていう処理系 もありと。) 個人的にはimplicit forceしてくれた方がずっとプログラマに易しいと 思う。R5RSでそうなっていないのは、色々な遅延評価メカニズムを実装する ベースとしての処理系実装も許しているからなんじゃないかな。色々 試してみたいときにはforceされるタイミングを制御したいことも あるんじゃない?
685 名前:デフォルトの名無しさん mailto:sage [04/10/09 17:31:52] 具体的なコードを挙げると説得力が増すぞ。
686 名前:デフォルトの名無しさん mailto:sage [04/10/09 17:42:30] delay/forceが無駄な仕様にみえて仕方がない。 Schemeの思想と背反する様な。 実際使う事あるの?
687 名前:デフォルトの名無しさん mailto:sage [04/10/09 17:46:52] くまああああああ
688 名前:682 mailto:sage [04/10/09 17:47:40] レスありがとう。 >>684 R5RSの注意すべき点は、プロミス型があるかどうかではなくてプロミスが オブジェクトであること(R5RS 4.2.5)だと思う。それが根本的な問題かと。 > forceされるタイミングを制御したいことも ありそうだよね、これ。ただ、必要になったときに強制されるのだ、という 方が純粋なcall-by-needに近いようにも思う。 >>685 リンクたどればあるよ。
689 名前:デフォルトの名無しさん mailto:sage [04/10/09 18:13:49] >>674 "On Lisp"とかぐーぐるさまに教えると次の検索で少しは幸せになれるんではなかろうか。
690 名前:682 mailto:sage [04/10/09 18:25:58] 再レス。 >>684 > プロミスなんてユーザには見えない、っていう処理系もありと あなたの言ってることがわかったw R5RSのforceの解説の最後の方にそう書いてあるのね。完全に見落としてた。 thx
691 名前:デフォルトの名無しさん mailto:sage [04/10/09 19:11:42] forceはpromiseにしか適用できない(かもしれない)のに、 promiseであるかどうか判別する手段が無い(かもしれない)。 つまり完全に評価順序が分かっててpromiseと値を混在させないように プログラムが書けるときしか使えない。 でも遅延評価ではあらかじめ評価順序を知るのは一般にはとても難しい。 実用性が全然ないような。(>>616 をさえ遅延評価で書くのに挫折…)
692 名前:デフォルトの名無しさん mailto:sage [04/10/09 19:29:32] >>691 forceは何にでも適用できるよ。それは保証されてる。 promiseであるかどうか判別する手段はないかもしれない。
693 名前:デフォルトの名無しさん mailto:sage [04/10/09 20:04:18] >>692 どこに書いてある? 例えば MIT Scheme 1 ]=> (force 1) ;The object 1, passed as an argument to force, is not a promise. ;To continue, call RESTART with an option number: ; (RESTART 1) => Return to read-eval-print level 1. 2 error>
694 名前:692 mailto:sage [04/10/09 20:48:54] あ、わりい。漏れの勘違い。 'may' だから、適用できるかどうかわからんのね。 なんだ、ますます使い勝手が悪いなあ。
695 名前:デフォルトの名無しさん mailto:sage [04/10/10 02:59:20] >>691 関数的なもの、つまり副作用が無いものであれば評価順序に意味は無いはず。 そういうものと組み合わせてこそ promise の真価は発揮される。 一度評価したら二度目以降の force は必ず同じ値になるというのもそう。 とはいいつつも delay/force を使ったことないや。
696 名前:デフォルトの名無しさん mailto:sage [04/10/10 17:26:47] >>695 > 関数的なもの、つまり副作用が無いものであれば評価順序に意味は無いはず。 間違い。それなら遅延評価なんて要らない。 そもそも副作用の話はしていない。>>691 で言っているのは、 「評価順序が完全にわかってない場合、一度forceしてしまったものに もう一度forceしてしまうことがあり、それがエラーになる(実装依存で)」 ということ。
697 名前:デフォルトの名無しさん mailto:sage [04/10/10 17:46:22] 何度 force しようが promise は promise のままでは? force した結果の値を他で保持しておく必要無いんだし
698 名前:デフォルトの名無しさん mailto:sage [04/10/10 18:25:57] 691は「渡された値がpromiseかどうかわからないから念のためforceしとけ」 ってことができない、って言いたかったんじゃない? >>695 正規順序と適用順序について調べるとよろし。
699 名前:デフォルトの名無しさん mailto:sage [04/10/10 20:19:31] >>697 forceした結果を他の関数に渡さないと計算は進まないし、 delayし忘れると計算してしまう。 なにか自分でプログラミングしたら難しさがわかると思うけど。 自分が遅延評価のプログラムだと思うものをgoshで組んだ後 MIT Schemeにかけてそのまま動いたら、結構すごいことだと思うよ。
700 名前:デフォルトの名無しさん mailto:sage [04/10/10 20:42:36] >>698 そうです。 全部promiseにしてしまえばいいのだろうけれど、 それには一から遅延評価の処理系を作るか、 それなりのライブラリを作った上で注意深くforce/delayを 利用しつつ目的のプログラムを作るか、 ということになって、どっちもかなりのオーバーヘッド。 すぐには計算して欲しくない所にだけ適当にdelayいれておいて後で なんとかするというわけにはいかない。
701 名前:デフォルトの名無しさん [04/10/10 21:07:36] >>655 微妙に訳が違ってないか? Eighty percent of those diagnosed with autism or a related disorder scored 32 or higher. 元訳:32ポイント以上のうち8割はautism related disorder 試訳: 自閉症やその関連の診断を受けた人の8割は、32ポイント以上だった。 つまりこれは、このテストが8割の診断者をカバーすると言ってはいるが、 普通の人がテストを受けて、スコアが高ければ自閉症だ、とは言っていないんじゃないか?
702 名前:デフォルトの名無しさん mailto:sage [04/10/10 21:17:48] 自閉症は黙ってろ
703 名前:デフォルトの名無しさん mailto:sage [04/10/10 21:27:16] ACになろうとして 感電死
704 名前:デフォルトの名無しさん mailto:sage [04/10/10 22:46:04] >>701 そのとおり。 つまり、テスト問題を 1 + 1 = 2 は正しいか? にすれば、 Ninety nine percent of those diagnosed with autism or a related disorder scored fully.
705 名前:ミミ mailto:sage [04/10/11 16:57:33] Unicode (UTF-16) ベースの Scheme 処理系を作る場合、 R5RS の read-char 手続きは、ポートから 2 バイトを読み取って Unicode 文字を返すのが 自然ですよね?1バイト読み取りのためには read-byte のような拡張手続きを用意して。 既存コードとの互換性がなくなると思いますけど。。。
706 名前:デフォルトの名無しさん mailto:sage [04/10/11 17:18:08] read-charとかの関数の他に読み込む文字種を指定できるといいんじゃないかな (set-input-char-set 'ネコミミモード) (with-input-char-set 'ネコミミモード (read) ) =>ネコミミモードでーす とか
707 名前:デフォルトの名無しさん mailto:sage [04/10/11 17:53:02] read-char は「文字」を返すだけで、それがどんなエンコードだとかどんなサイズであるかなどは R5RS では規定されていない
708 名前:デフォルトの名無しさん mailto:sage [04/10/11 17:53:35] CMUCL は,C++ の .so を呼べないのでしょうか? //////////////////// a.cc int foo (int a, int *b) { int c; c = *b - 10; *b = a * 10; return c; } //////////////////// # g++-3.4 -shared -o a.so a.cc ;;;;;;;;;;;;;;;;;;;; a.lisp (use-package "ALIEN") (use-package "C-CALL") (load-foreign "./a.so") (def-alien-routine "foo" int (a int) (b int :in-out)) (foo 13 3) ;;;;;;;;;;;;;;;;;;;; # lisp -load a.lisp -eval '(quit)' とやると,(長いので分割)
709 名前:708 mailto:sage [04/10/11 17:56:00] ; Loading #p"/xxxxx/a.lisp". ;;; Opening shared library ./a.so ... ;;; Done. Undefined foreign symbol: "foo" [Condition of type KERNEL:SIMPLE-PROGRAM-ERROR] Restarts: 0: [CONTINUE] Return NIL from load of "a.lisp". 1: [ABORT ] Skip remaining initializations. Debug (type H for help) (KERNEL:UNDEFINED-FOREIGN-SYMBOL-ERROR-HANDLER "<error finding name>" #.(SYSTEM:INT-SAP #x3FFFC7E8) #<Alien (* #) at #x3FFFC480> (14)) Source: Error finding source: Error in function DEBUG::GET-FILE-TOP-LEVEL-FORM: Source file no longer exists: target:code/interr.lisp. 0] (quit)
710 名前:デフォルトの名無しさん mailto:sage [04/10/11 18:58:09] a.soのシンボルをリストアップしてみりゃわかるよ
711 名前:708 mailto:sage [04/10/11 19:20:52] >>710 はじめてナノメートル nm しました. うまくいきました! ありがとうございます. 今から >>710 に萌えます (;´Д`) gcc で作ったやつと比較して,トンでもないシンボル名になっていました. でもその名前で lisp コードに書き,アンダーバー `_' をハイフン `-' に変えて 使ってみると,正常に動きました. シンボル名が変にならないようにする方法はこれから調べます.
712 名前:デフォルトの名無しさん mailto:sage [04/10/11 19:35:31] >>705 see srfi-56
713 名前:デフォルトの名無しさん [04/10/11 22:27:42] call-with-current-continuationについて教えてください. 多分誤解しているのだと思います. たとえば, (call/cc (lambda (k) (* 20 (k 30)))) => 30 になると思います. これを, 「kというprocedureがactiveになった時点で,それに 渡されるべき30という引数が返されたのである」と 理解していましたが,これは誤りなのでしょうか? この考え方をもって既存のコードを読むと,実際に 返される値と異なる結果になってしまいます. どこがいけないか,ご指摘願えますでしょうか. よろしくお願いいたします.
714 名前:デフォルトの名無しさん mailto:sage [04/10/11 22:55:04] kという手続きがxを引数に呼び出されると、 対応するcall/ccの返却値としてxが戻される。 もちろん後続の処理もcall/ccが普通に戻った場合と同じように続く。
715 名前:デフォルトの名無しさん mailto:sage [04/10/11 23:08:44] >>713 「procedureがactiveになる」ってどゆこと?
716 名前:デフォルトの名無しさん mailto:sage [04/10/11 23:24:50] >>713 Gaucheでの出力だけど... (define m '()) (list 1 2 3 (call/cc (lambda (k) (set! m k))) 4 5 6) --> (1 2 3 #<subr continuation> 4 5 6) m -->#<subr continuation> (m 999) --> (1 2 3 999 4 5 6) (list 1 2 3 (+ 100 (call/cc (lambda (k) (set! m k)))) 4 5 6) --> 継続と100は足せないというエラー (list 1 2 3 (+ 100 (call/cc (lambda (k) (set! m k) 100))) 4 5 6) --> 1 2 3 200 4 5 6 (m 500) -->1 2 3 600 4 5 6 つまり継続を呼び出すときの引数でそれを作った(call/cc ...)が丸ごと置き換わると考えるととりあえずよいかもしれない。 うまい説明になってないかな^^? (list 1 2 3 (+ 100 (call/cc (lambda (k) (set! m k)))) 4 5 6) --> 継続と100は足せないというエラー (list 1 2 3 (+ 100 (call/cc (lambda (k) (set! m k) 100))) 4 5 6) --> 1 2 3 200 4 5 6 (m 500) -->1 2 3 600 4 5 6 つまり継続を呼び出すときの引数で(call/cc ...)が丸ごと置き換わると考えるととりあえずよいかもしれない。 あまり説明になってないかな^^?
717 名前:デフォルトの名無しさん [04/10/11 23:26:16] >> 715 713です. 「procedureが呼び出される」に訂正. >> 714 ありがとうございます. ということは根本的に間違えた考えではないと理解して, コードを追い直しています.
718 名前:716 mailto:sage [04/10/11 23:27:55] 書き込みの途中に継続を呼んでしまったようだ... ごめん m(_ _)m
719 名前:デフォルトの名無しさん [04/10/11 23:45:56] >> 716 ありがとうございます. 実際に追っているコードを示した方が早いので,そうします. たとえば,Kent Dybvig プログラミング言語Scheme (日本語版) p.61に,call/ccのサンプルとして (let ((x (call/cc (lambda (k) k)))) (x (lambda (ignore) "hi"))) => "hi" というのがありますが,これは結局 (call/cc (lambda (k) k) (lambda (ignore) "hi")) と等価(でよいのでしょうか)ですね. この式内の引数 (lambda (ignore) "hi")はprocedure だから,答は本にあるように "hi" じゃなくて,その procedure自体(#<user-defined-function> みたい) になると思うのです. しかし確かにguileなどでは本の通り "hi" と出ます. 問題はこのprocedure自体を返すのか,evalった結果を 返すのかの違いにあるのだと思いますが、「eval忘れ」 がどこかにあるのでしょうか? ちなみに kawa ではエラーとなり確認できません.
720 名前:デフォルトの名無しさん mailto:sage [04/10/11 23:47:02] >>711 >シンボル名が変にならないようにする方法はこれから調べます. そいつはC++を使ってる限り無理だ。関数の多重定義を実現するために、 シンボルには型情報がくっつくようになってる。
721 名前:デフォルトの名無しさん mailto:sage [04/10/11 23:47:17] 継続(continuation)のメモ ttp://www.opengroupware.jp/~hoti/blog/Scheme
722 名前:デフォルトの名無しさん [04/10/12 00:03:24] 719 です. >問題はこのprocedure自体を返すのか,evalった結果を >返すのかの違いにあるのだと思いますが、「eval忘れ」 >がどこかにあるのでしょうか? は間違いですね。 問題はこのprocedure自体を返すのか,呼び出した結果を 返すのかの違いにあるのだと思いますが、「呼び出し忘れ」 がどこかにあるのでしょうか? の意味です。
723 名前:708 mailto:sage [04/10/12 00:04:17] >>720 なんと,,,そうですか.今ちょっと調べ疲れていたところでした. どうもありがとうございました. まあ lisp コードなんてすぐ修正できてしまうからいいんですよね!
724 名前:デフォルトの名無しさん mailto:sage [04/10/12 00:13:42] >>719 最初に (x (lambda (ignore) "hi")) を評価するとき x は継続であり、それは 「最初の (call/cc (lambda (k) k))」から戻ってきて、返却値を x に bind し、let の body を評価する」 という継続である。 なので、これを評価すると最初の (call/cc (lambda (k) k)) から (lambda (ignore) "hi") が返却され、 これが x に bind され、(x (lambda (ignore) "hi")) が再度評価されることになる。 二度目に評価されるとき、x には (lambda (ignore) "hi") が bind されているので、これはつまり ((lambda (ignore) "hi") (lambda (ignore) "hi")) ということになり、最終的に "hi" が返却される。
725 名前:デフォルトの名無しさん [04/10/12 00:34:47] 訂正 719の中の置換したコードは ((call/cc (lambda (k) k)) (lambda (ignore) "hi")) のつもりでした. >>724 ありがとうございます.最終的に ((lambda (ignore) "hi") (lambda (ignore) "hi")) に置換されるのがミソのようですね. まだまだSchemerになれていないので,724をなぞって ゆっくり考えます.ありがとうございました.
726 名前:デフォルトの名無しさん mailto:sage [04/10/12 01:59:29] >>723 extern "C" { ネコミミモード };
727 名前:716 mailto:sage [04/10/12 02:43:54] おれが安易に「丸ごと置き換わると考えるととりあえずよいかもしれない」なんて書いちゃったのは良くなかった。ごめんなさい m(_ _)m 置換で考えると上手くない場合もあるんだ。 例えば、 (let ((c 100)) (let ((x (call/cc (lambda (k) k)))) ;<- @1 (let ((c 200)) (x (lambda (n) (+ 1 c)))))) ;<- @2 --> 201 の (call/cc (lambda (k) k)) を単純に (lambda (n) (+ 1 c))に置き換えて考えてしまうと (let ((c 100)) (let ((x (lambda (n) (+ 1 c)))) (let ((c 200)) (x (lambda (n) (+ 1 c)))))) --> 101 となって結果が合わなくなってしまう。 これは@2のlambdaで作られた#<closure>は@1に送られるけど、その環境は@2を持っているということが単純な置換で考えると消えてしまうからなんだ。 というわけで、716は忘れてください ^^;
728 名前:デフォルトの名無しさん mailto:sage [04/10/12 09:57:42] スコープだけじゃないね。 (let ((x 0)) (let ((c (call/cc (lambda (x) x)))) (set! x (+ x 1)) (c (lambda (y) x)))) と (let ((x 0)) (let ((c (lambda (y) x))) (set! x (+ x 1)) (c (lambda (y) x)))) はちがうし。 あたかも置き換えたかのようにジャンプするというか・・・。
729 名前:デフォルトの名無しさん [04/10/12 20:10:09] 713です. 多くの丁寧な follow-up をありがとうございます. call/ccはSchemeらしいところだと思うのですが それだけ奥が深いですね. 何せ midnight programmer なものですから, これから寝るまで頭をひねって考えます. 今後ともよろしくお願いします.
730 名前:デフォルトの名無しさん mailto:sage [04/10/12 20:27:57] schemeの継続って、プログラムの最小限要素をくくりだすのはいいが そのためにやたらコストの高いものを導入してしまったという感じがする。 Smalltalkでの何でもかんでもオブジェクトとメッセージに近いものがある。 継続そのものが便利なときもあるけど、なくてもほとんど困らない。
731 名前:デフォルトの名無しさん mailto:sage [04/10/12 20:31:45] 継続抽出は銀の弾丸です
732 名前:デフォルトの名無しさん mailto:sage [04/10/12 20:44:17] ほんとにそうなら継続のある言語がとっくに天下をとってると思う。
733 名前:デフォルトの名無しさん mailto:sage [04/10/12 21:44:11] 悪い方が良い法則。
734 名前:デフォルトの名無しさん mailto:sage [04/10/12 22:35:38] おまえらただ継続継続いいたいだけちゃうんかと。 継続なんて極力使わない方がいい。 gotoがよりパワフルにそしてわかりにくくなったものだから。 銀の弾丸どころかソフトウェアエンジニアリング的には狼男だ。
735 名前:デフォルトの名無しさん mailto:sage [04/10/12 22:39:36] 例外処理のような上手い使い方ならいいんだけどね
736 名前:デフォルトの名無しさん mailto:sage [04/10/12 23:02:34] ちんちんかゆいーー!
737 名前:デフォルトの名無しさん mailto:sage [04/10/12 23:03:46] gotoが悪ならthreadなんて巨悪だな
738 名前:デフォルトの名無しさん mailto:sage [04/10/12 23:04:48] >>736 cut しろ
739 名前:デフォルトの名無しさん mailto:sage [04/10/12 23:35:23] >>737 threadとgotoは比べるもんじゃないだろ。 threadは基本的に代えがきかない。
740 名前:デフォルトの名無しさん mailto:sage [04/10/13 03:12:19] The Seasoned Schemerの継続の説明らしい章を読んでます。 で、質問なんですが、この本の中では継続を「call/cc」じゃなくて 「letcc」(schemeの場合)、「throw」「catch」(CommonLispの場合)で 説明してるんですけど、これらは等価なものなんですか?
741 名前:デフォルトの名無しさん mailto:sage [04/10/13 03:30:06] >>740 shiroさんのなぜ Scheme には return がないのか www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Scheme%3a%a4%ca%a4%bcScheme%a4%cb%a4%cfreturn%a4%ac%cc%b5%a4%a4%a4%ce%a4%ab を読むとその辺がわかるかも。