[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 03/26 12:58 / Filesize : 286 KB / Number-of Response : 995
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

CommonLisp Scheme Part11



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あたり


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
を読むとその辺がわかるかも。

742 名前:デフォルトの名無しさん mailto:sage [04/10/13 10:25:44]
continuationとgotoは比べるもんじゃないだろ。
continuationは基本的に代えがきかない。




743 名前:デフォルトの名無しさん mailto:sage [04/10/13 14:30:21]
はっきり言って、continuation≒gotoだよ。認めたくないだろうけどね。
gotoでcontinueもbreakもreturnも出来るじゃん、美しい!って悦に入ってるのが
schemer

744 名前:デフォルトの名無しさん mailto:sage [04/10/13 16:12:52]
だがそれがいい

745 名前:デフォルトの名無しさん mailto:sage [04/10/13 16:21:01]
>>742
おうむ返しだけだと馬鹿にしか見えませんよ。

continuationはやろうと思えばいくらでも書き換えられる。
書き換えたらフラグだらけになったり、
巨大な関数になったりしてして醜いから、使う、というものでしょ。
もちろんそういうときに使うのはいいけど、
できるときはwhileとかforとかmacroにしたほうがいいだろう。

threadはthreadを使わずに同じ機能を実現することが難しい。
特にthreadのどれか一つが死んだりしても他のthreadが監視しておいて
処理できる、という能力はエミュレートできない。
エミュレートだとスケジューリングがうまくいくように一単位の
処理時間をコントロールできないといけないし。

746 名前:デフォルトの名無しさん mailto:sage [04/10/13 21:25:49]
ケイゾクに恨みでもあるんですか?

747 名前:デフォルトの名無しさん mailto:sage [04/10/13 21:57:42]
色んな意味でコストがかかるところ。


748 名前:デフォルトの名無しさん mailto:sage [04/10/13 22:54:32]
>>746 ないけど?

749 名前:デフォルトの名無しさん mailto:sage [04/10/14 00:13:10]
threadだって高速に処理切り替えてるだけだから、
gotoで出来ないことはない。

750 名前:デフォルトの名無しさん mailto:sage [04/10/14 00:39:00]
スレッドと継続は全く別個の独立した概念であり、対立するものでもないのに何をムキになってるんだろう。


> 書き換えたらフラグだらけになったり、
> 巨大な関数になったりしてして醜いから、使う、というものでしょ

それこそ継続という概念が primitive なものであるということであり、scheme らしいところでは?
primitive なものさえあれば他の機能はそれらを組み合わせてできる。美しい。
例えば、コルーチン程度であれば call/cc で簡単に実現できる。

751 名前:デフォルトの名無しさん mailto:sage [04/10/14 00:54:20]
コルーチン程度しかできない、の間違いでしょ

752 名前:デフォルトの名無しさん mailto:sage [04/10/14 01:06:04]
Rubyの継続の実装はスレッドと同じだそうですよ
i.loveruby.net/ja/rhg/cd/continuation.html



753 名前:デフォルトの名無しさん mailto:sage [04/10/14 01:44:06]
>>749
gotoでどうやって
> 特にthreadのどれか一つが死んだりしても他のthreadが監視しておいて
> 処理できる、という能力はエミュレートできない。
するんだ?
そしてどうやって一つの処理単位がCPUタイムを食いすぎないことを保証するんだ?
> エミュレートだとスケジューリングがうまくいくように一単位の
> 処理時間をコントロールできないといけないし。

>>750
> スレッドと継続は全く別個の独立した概念であり、対立するものでもないのに何をムキになってるんだろう。
じゃああなたが>>737>>749を説得して上げてください。

754 名前:デフォルトの名無しさん mailto:sage [04/10/14 01:45:11]
gotoさえ使えば、breakもcontinueもreturnもいらないのはもちろん、
スレッドも関数もいもいらない。こういう機能はgotoを組み合わせてできる。
美しい。

755 名前:デフォルトの名無しさん mailto:sage [04/10/14 01:53:27]
>>750
美しかろうがどうだろうが、
「継続を無闇に使うべきでない」という事実には変わりはないな。

756 名前:デフォルトの名無しさん mailto:sage [04/10/14 01:54:45]
アセンブラにすりゃただのジャンプ命令。
ジャンプ命令使わずにアセンブラでプログラム組めるわけが無い。
即ち、息をするようにgotoを使え。

757 名前:デフォルトの名無しさん mailto:sage [04/10/14 04:40:12]
引数つきgoto

758 名前:デフォルトの名無しさん mailto:sage [04/10/14 08:16:21]
〉〉753OSやリアルタイム制御の本みれば書いてあるよ。つーか知らないの?

759 名前:デフォルトの名無しさん mailto:sage [04/10/14 08:28:20]
ヘタレLisperと本物のプログラマを隔てるOSという一つの壁

760 名前:デフォルトの名無しさん mailto:sage [04/10/14 08:29:07]
>>736-738
Prologの話?

761 名前:デフォルトの名無しさん mailto:sage [04/10/14 09:24:37]
まだちんちんかゆいよーー!
なぜか皮が膨らんできてる・・・

762 名前:デフォルトの名無しさん mailto:sage [04/10/14 11:39:34]
>>751
ユーザモードのスレッドは、本質的にはコルーチンと同等だけど?



763 名前:デフォルトの名無しさん mailto:sage [04/10/14 16:06:08]
コルーチンって何?

764 名前:デフォルトの名無しさん mailto:sage [04/10/14 16:18:27]
>>763
www.google.com/search?hl=ja&lr=lang_ja&ie=SJIS&oe=SJIS&num=100&q=%83R%83%8B%81%5B%83%60%83%93

765 名前:デフォルトの名無しさん mailto:sage [04/10/14 17:26:42]
>>762
ユーザーモードのスレッドは必ずしもそうでないと思うけど、
ユーザーモードのスレッドライブラリはそうだね。で、それが何か?


話は変わって、
そもそもSchemeの継続ってプリミティブか?
単にCPSで書けばいいだけじゃないの?こっちはどんな関数型言語にもできるし。

766 名前:デフォルトの名無しさん mailto:sage [04/10/14 17:43:15]
機械語のライブラリを実行中に継続を取ってきても
きちんと動くように要請してるんじゃない?

767 名前:デフォルトの名無しさん mailto:sage [04/10/14 20:38:44]
>>765
なんでそこに CPS が出てくるのか意味がわからない

768 名前:デフォルトの名無しさん mailto:sage [04/10/14 20:45:57]
>>768
Continuation Passing Style のことだよ?

769 名前:デフォルトの名無しさん mailto:sage [04/10/14 21:25:50]
>>767 の言いたいことを推測。

CPSで継続を陽に扱うには、最初から全部CPSで書かなくちゃならない。
CPSで書かれていないコードから呼ばれるコードで継続を取り出したかったら
call/ccはプリミティブにならざるを得ない。

…ってなとこか?
CPSでもMonadみたいな形で継続を隠すことはできるけど、それだって
最初からそのつもりで書いてないと。

個人的には、Schemeの継続は言語の実験をするための道具って
感覚が強いな。




770 名前:765 mailto:sage [04/10/14 21:44:13]
>>769
言語の要素のプリミティブじゃなくて、
>>750
> それこそ継続という概念が primitive なものであるということであり、scheme らしいところでは?
> primitive なものさえあれば他の機能はそれらを組み合わせてできる。美しい。
の話。

(Schemeの)継続なんて無くてもCPSで書けば、gotoでもコルーチンでも
call/ccでも(w実現できるんだから、プリミティブな(基底をなす)機能ではないんでは?
ということ。

> 個人的には、Schemeの継続は言語の実験をするための道具って
> 感覚が強いな。
同意。

771 名前:デフォルトの名無しさん mailto:sage [04/10/14 22:03:36]
やたら継続を美しいと賛美しているのは、つい最近大学の
講義で継続を知って嬉しくなってる厨房だよね?

772 名前:デフォルトの名無しさん mailto:sage [04/10/14 22:11:31]
>>771
はい。



773 名前:デフォルトの名無しさん mailto:sage [04/10/14 22:26:47]
四角いタイヤでも目盛がついていれば長さを測ったりできて便利かもしれんが、
それで高速道路を走るのは無理だ。

774 名前:デフォルトの名無しさん mailto:sage [04/10/14 22:37:43]
で?

775 名前:デフォルトの名無しさん mailto:sage [04/10/14 22:42:13]
ちんちんかゆいーー!

776 名前:デフォルトの名無しさん mailto:sage [04/10/14 22:44:58]
>>775
切っとけ。

777 名前:デフォルトの名無しさん mailto:sage [04/10/14 23:38:01]
>>770
だから?基底をなす機能しか使っちゃいけないなら、
ラムダだけ使えば?
理論上は統べての計算はラムダ式で可能なんだから、


778 名前:デフォルトの名無しさん mailto:sage [04/10/15 00:28:51]
継続がプリミティブだからエライと言い出した
のは継続厨房でしょうが

779 名前:デフォルトの名無しさん mailto:sage [04/10/15 01:15:03]
だからつかわなきゃいいじゃん
threadだろうがcall/ccだろうが理解してない
人間がつかうと危険なのは当たり前。

780 名前:デフォルトの名無しさん mailto:sage [04/10/15 01:20:39]
>>778
エライなんて誰も言ってないよ

781 名前:デフォルトの名無しさん mailto:sage [04/10/15 10:39:17]
>>777
基底をなす機能しか使っちゃいけないなんて誰も言ってないよ。

>>779
理解している人間が使ったって危険なんですが。
というか、誰が使っても危険なものだということを理解していない人間は
理解している人間ではないでしょうね。

782 名前:ミミ mailto:sage [04/10/15 14:26:27]
>> 個人的には、Schemeの継続は言語の実験をするための道具って
>> 感覚が強いな。
>同意。
私も同意。
例外処理のような代替機能があれば十分だと思う。



783 名前:デフォルトの名無しさん mailto:sage [04/10/15 16:26:43]
どういう場合になにが危険といってるの?実装といっしょにあげてみてよ。

784 名前:デフォルトの名無しさん mailto:sage [04/10/15 17:19:01]
>>782
で、言語の実験で良い結果が得られたらその度に代替機能を実装してくの?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<286KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef