宿題はやるな
tags: 情報
僕/私はどう評価されているの?
僕/私はどう評価されているのだろうか?
人間社会に生きていれば当たり前に感じることですよね?
容姿,能力,家柄,学歴等々,人によって人をどこから,どのように評価するか千差万別です
それはプログラミング言語とて同様!
プログラミング言語も,プログラミング言語によって,式を評価をする順番は違います
自分がどう評価されているか知る前に,少し落ち着いてプログラミング言語において式がどのように評価されるかを見てみましょう
評価の区分は夏休みの過ごし方に似ている
評価の仕方は大きく分けて2つです
- Applicative(eager)-order
- Normal(lazy)-order
前者(先行評価)は式を先に評価し,後者(遅延評価)は式が必要になるまで評価しません
要するに,夏休みが始まる前に宿題を終える人と,夏休み最終日まで宿題を溜める人です
溜める方がNormalなことから分かるように,人間は宿題を溜めるものだということです(いやlazyなのか?)
例えば,以下のようなScheme
のコードがあるとします
(define (p) (p)) ;; 無限に再帰する関数 (define (test x y) (if (= x 0) ;; xが0なら0を,それ以外はyを返す 0 y)) (test 0 (p))
Applicative(eager)-order
もしこれが宿題を終わらせるタイプなら,式は以下のように評価され永遠に終わりません
(test 0 (p)) ;; ここがスタート (test 0 (p)) ;; (p)を評価して(p)になる (test 0 (p)) ;; (p)を評価して(p) ...
Normal(lazy)-order
溜めるタイプの場合は次のように(if (= x 0))
が評価されると,関数が0を返し終わります
(test 0 (p)) ;; ここがスタート 0 ;; 0を出力して終了
ちなみに
どっちが早いかどうかは時と場合によります
Scheme
はapplicative-order
なので,式を先に評価してます(gauche
やracket
など自分の処理系で試してみるとわかります)
そのため,この関数は無限に終わりません
ということで,宿題を終わらせるととんでもないことになるということがわかりました(謎論理)
「宿題は(直前まで)やるな」ということが今回の教訓です
追記
前回書いたときは寝ぼけていたので書こうと思っていることと反対のことを書いていました
「寝るべし」という教訓も得られました(適当)
知識欲旺盛な人へ
- 遅延評価を実装したくなった人はこの本を読みましょう:https://mitpress.mit.edu/sites/default/files/sicp/index.html
- ガバガバな話が嫌になった人はこちらを:https://en.wikipedia.org/wiki/Evaluation_strategy
- Web上で
Scheme
が書けるアプリ:https://hub.gke.mybinder.org/user/calysto-calysto_scheme-moxg9l0v/notebooks/notebooks/Reference%20Guide%20for%20Calysto%20Scheme.ipynb