Lisp Scheme Part41 (809レス)
Lisp Scheme Part41 http://mevius.5ch.net/test/read.cgi/tech/1531587928/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
リロード規制
です。10分ほどで解除するので、
他のブラウザ
へ避難してください。
187: デフォルトの名無しさん [sage] 2020/04/28(火) 11:03:05.28 ID:jkGkDNpV Scheme の map 手続きについて、 手続きを適用する順序 (副作用が発生する順序) は仕様上は未規定ということになっています。 各処理系として保証するということは有りえるんですが、 Racket の場合は保証されていると読み取って良いでしょうか? https://docs.racket-lang.org/reference/pairs.html?q=map#%28def._%28%28lib._racket%2Fprivate%2Fmap..rkt%29._map%29%29 わざわざ "from the first elements to the last" という書き方をしているからには順序を意図しているように 解釈するのが自然かとは思うんですが、単に範囲を言っていると解釈できなくもないので、 英語と Racket に明るい方がいればご教示賜りたいです。 http://mevius.5ch.net/test/read.cgi/tech/1531587928/187
188: _ [sage] 2020/04/28(火) 14:05:01.63 ID:moc7J10E >>187 racket使ってるわけでも英語ができるわけでもないけど。 最初から最後までって範囲の話してるんじゃなかろうか。 順序の保証があるなら IN ORDER とか付きそうな気がする。 http://mevius.5ch.net/test/read.cgi/tech/1531587928/188
190: デフォルトの名無しさん [sage] 2020/04/29(水) 01:16:58.58 ID:y02v3tEE >>187 保証とはどういうことを指しているのだろう 将来仕様を変更しないとは書いていないのは確かなようだ racketでは引数の評価もleft to rightとは書いてあった schemeでもfor-eachは先頭から順番に評価する 実際に評価順の違いが観察できるのはchezかな http://mevius.5ch.net/test/read.cgi/tech/1531587928/190
191: デフォルトの名無しさん [sage] 2020/04/29(水) 03:18:21.69 ID:ALOjMFFX >>189 > 私は R5RS (など) と言い回しが違うという点に引きずられていましたが、 > "from the first elements to the last" というフレーズ単体で見ると範囲のニュアンス > で捉える方が自然ですかね。 いや、違う。 R5RSとRacket Reference v7.6とでのmapが手続き(proc)を適用する要素の順番に関して言及しているのは 各々、以下の箇所だが、両者では明らかに全く異なる。 R5RS>The dynamic order in which proc is applied to the elements of the lists is unspecified. Racket>Applies proc to the elements of the lsts from the first elements to the last. R5RSは>>187で君が述べていた通り、リストの要素への適用順序はunspecifiedだと明確に書いてある。 これに対してRacket v7.6ではprocをlstsの最初の要素から最後の要素へと適用すると書いてある、 つまりリストlstsの要素の並びの順番に手続きprocを適用して行くと明記している。 だからprocとして受け取った値を標準出力に書き出す手続きを渡せば、R5RSでは表示される要素の順番はどんな順序でも良いのに対して Racket v7.6では元のリストlstの要素の並び順に必ず表示せねばならない。 これは私の想像だが、R5RSでmapが手続きを適用する要素の順番を規定しないと明記しているのは長大なリストに対する並列処理を可能にするためだろう。 逆に言えば手続きの適用順序を確実に把握したい場合にはmapでなくfor-eachを使えというのがR5RSを定めたチームの言語設計上の意図だろう。 >>190 > 保証とはどういうことを指しているのだろう その言語仕様書のそのバージョンに準拠していると宣言している言語処理系は、それを守らねばならない(守っていなければバグだ)という意味だよ。 だから今の例では、Racket Reference v7.6準拠と処理系が宣言したら、その処理系はmapで手続きを適用する要素の順番を必ずリストの並び順に する義務が生ずる(Racket v7.6の定める言語仕様=Racket v7.6ユーザとの約束の順守を保証せねばならない)、ということだ。 当然ながら、言語仕様書のバージョンが変われば約束(つまり言語仕様による規定の内容)も変更され得る。 http://mevius.5ch.net/test/read.cgi/tech/1531587928/191
192: デフォルトの名無しさん [sage] 2020/04/29(水) 06:44:54.55 ID:bLWOmnfL >>187 処理系によって(A B C)の評価順序が (1 2 3)だったり(3 1 2)だったり(3 2 1)だったりするから mapのようなリストで処理結果を返すような関数のクロージャ内では原則副作用は起こさないことが求められる for-eachみたいな初めから副作用を期待する関数はどう並べようが問題は起きない http://mevius.5ch.net/test/read.cgi/tech/1531587928/192
196: 187 [sage] 2020/04/29(水) 13:42:08.04 ID:sxS/u8Yc >>195 継続については「call/cc は副作用を生じる」というひとことで説明できます。 副作用とは何かというのは色々なモデル化のやり方があってはっきりしたひとつの定義を 定められないみたいなんですが、この説明が納得感があって参考になると思います。 https://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3Acall%2Fcc%E3%81%A8%E5%89%AF%E4%BD%9C%E7%94%A8 副作用がないなら順序なんか考える必要はないんですよ。 どの順序で実行されようと並列であろうと (観測できる) 結果は同じなので順序を気にする意味がありません。 結果が同じにならない場合 (副作用がある場合) がどうあるべきか考えるから順序が効いてくるんです。 で、副作用がある手続きの中でも特に第一級継続は (観測できるだけでなく) 流れを変えることが出来るから どれが妥当なのか結論が出ないなぁってことです。 http://mevius.5ch.net/test/read.cgi/tech/1531587928/196
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.022s