Lisp Scheme Part41 (858レス)
前次1-
抽出解除 レス栞

リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
191
(2): デフォルトの名無しさん [sage] 2020/04/29(水) 03:18:21.69 ID:ALOjMFFX(1/2) AAS
>>189
189(1): デフォルトの名無しさん [sage] 2020/04/28(火) 14:43:15.44 ID:jkGkDNpV(2/2) AAS
>>188
R5RS などでは手続きが各要素に適用される dynamic order は unspecified である
というような表現になってるんですよ。 order という語が主語になってます。

外部リンク[html]:docs.racket-lang.org

だからわざわざ変えた表現をするからには違うこと (順序が保証される) を言おうとしているんだろうと思いつつも、
明確に順序を強調してるわけでもないな……? というところで解釈に迷ってました。

私は R5RS (など) と言い回しが違うという点に引きずられていましたが、
"from the first elements to the last" というフレーズ単体で見ると範囲のニュアンス
で捉える方が自然ですかね。

私自身はいずれにしても map の副作用の順序に期待しないんですが、
しばらく前に Qiita に投稿されていた記事の中で map の順序が効いてくるコードがあったので、
これってありなんかなぁと思ったという経緯です。
> 私は 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
187(5): デフォルトの名無しさん [sage] 2020/04/28(火) 11:03:05.28 ID:jkGkDNpV(1/2) AAS
Scheme の map 手続きについて、
手続きを適用する順序 (副作用が発生する順序) は仕様上は未規定ということになっています。
各処理系として保証するということは有りえるんですが、
Racket の場合は保証されていると読み取って良いでしょうか?

外部リンク[html]:docs.racket-lang.org

わざわざ "from the first elements to the last" という書き方をしているからには順序を意図しているように
解釈するのが自然かとは思うんですが、単に範囲を言っていると解釈できなくもないので、
英語と Racket に明るい方がいればご教示賜りたいです。
で君が述べていた通り、リストの要素への適用順序はunspecifiedだと明確に書いてある。

これに対してRacket v7.6ではprocをlstsの最初の要素から最後の要素へと適用すると書いてある、
つまりリストlstsの要素の並びの順番に手続きprocを適用して行くと明記している。
だからprocとして受け取った値を標準出力に書き出す手続きを渡せば、R5RSでは表示される要素の順番はどんな順序でも良いのに対して
Racket v7.6では元のリストlstの要素の並び順に必ず表示せねばならない。

これは私の想像だが、R5RSでmapが手続きを適用する要素の順番を規定しないと明記しているのは長大なリストに対する並列処理を可能にするためだろう。
逆に言えば手続きの適用順序を確実に把握したい場合にはmapでなくfor-eachを使えというのがR5RSを定めたチームの言語設計上の意図だろう。

>>190
190(1): デフォルトの名無しさん [sage] 2020/04/29(水) 01:16:58.58 ID:y02v3tEE(1) AAS
>>187
保証とはどういうことを指しているのだろう
将来仕様を変更しないとは書いていないのは確かなようだ
racketでは引数の評価もleft to rightとは書いてあった
schemeでもfor-eachは先頭から順番に評価する
実際に評価順の違いが観察できるのはchezかな
> 保証とはどういうことを指しているのだろう

その言語仕様書のそのバージョンに準拠していると宣言している言語処理系は、それを守らねばならない(守っていなければバグだ)という意味だよ。
だから今の例では、Racket Reference v7.6準拠と処理系が宣言したら、その処理系はmapで手続きを適用する要素の順番を必ずリストの並び順に
する義務が生ずる(Racket v7.6の定める言語仕様=Racket v7.6ユーザとの約束の順守を保証せねばならない)、ということだ。

当然ながら、言語仕様書のバージョンが変われば約束(つまり言語仕様による規定の内容)も変更され得る。
193
(1): デフォルトの名無しさん [sage] 2020/04/29(水) 09:21:45.86 ID:sxS/u8Yc(1/3) AAS
>>192
192(1): デフォルトの名無しさん [sage] 2020/04/29(水) 06:44:54.55 ID:bLWOmnfL(1) AAS
>>187
処理系によって(A B C)の評価順序が
(1 2 3)だったり(3 1 2)だったり(3 2 1)だったりするから
mapのようなリストで処理結果を返すような関数のクロージャ内では原則副作用は起こさないことが求められる
for-eachみたいな初めから副作用を期待する関数はどう並べようが問題は起きない
それは承知しているのです。
ここでは Racket のドキュメントをどう解釈すべきかというのが論点です。

>>191
> 最初の要素から最後の要素へと適用すると書いてある

順番に (in order) とは書いていません。
順序が意味を持つ箇所ではおおよそ order という語で強調しているのに
それがないここでも順番であることを確信してよいほどに
(英語のニュアンスとして) 自明でしょうか。
194
(2): デフォルトの名無しさん [sage] 2020/04/29(水) 09:54:06.36 ID:sxS/u8Yc(2/3) AAS
>>191
> 長大なリストに対する並列処理を可能にするためだろう

手続きの引数の評価順序については未規定ではあるものの
"some sequential order of evaluation" という制約がついています。

外部リンク[html]:docs.racket-lang.org

ちょっとわかり難いんですが、これは「同時ではない (かのように動作する)」と解されるそうです。
たとえば

(list (begin (display 'a) (display 'b) 1)
(begin (display 'c) (display 'd) 2))

とあったときに表示は abcd か cdab のどちらかであり acbd だったり cabd だったりはしない
ということです。

map についてはこういう制約は書かれてはいないものの、
順序は規定しないという文言は「既定はしないけどなんらかの順序を想定する」
とも読めなくもないので並列化を許しているとは言い切れない気がします。

副作用がないときに限っては並列化しても仕様に反しないのは間違いないですけど、
その場合は順序に関して有るとも無いとも書く必要がないんですよね。
どうせ観測できないので。
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.034s