Hatena::Groupsicp

yharaの日記

参考リンク
 | 

2007-05-03

[].5 16:39

CBVとCBNの話。関数を呼び出すときに、引数を先に評価するか、関数を先に評価する(?)か、という。

用語をまとめてみる。

作用的順序(applicative-order)eager値呼び(call by value, CBV)正格
正規順序(normal-order)lazy名前呼び(call by name, CBN)非正格

世の中のほとんど言語はeagerが基本。lazyが基本の言語HaskellとかCleanとか(くらいしか知らない)。

さて、(test 0 (p)は作用的順序だと

(test 0 (p))
→ (test 0 (p))
→ (test 0 (p))
→ (test 0 (p))
...

無限ループになってしまう。

goshで確かめてみよう。

yhara@meteor:~/src/sicp % gosh
gosh> (define (p) (p))

(define (test x y)
  (if (= x 0)
      0
      y))
p
gosh> test
gosh> (test 0 (p))


無限ループしているようだ。

正規順序だと、

(test 0 (p))
→ (if (= 0 0) 0 (p))
→ 0

のように計算が停止する。

Haskellで確かめてみよう。

1.5.hs

p = p
test x y = if x == 0 then x else y

main = print $ test 0 p
yhara@meteor:~/src/sicp % runhugs 1.5.hs
0

ちゃんと停止したようだ。

ChristianaChristiana2012/01/10 09:33That's more than snebsile! That's a great post!

sgiodkkfjgssgiodkkfjgs2012/01/10 19:14Gv8tkW <a href="http://cjqpfjauqswr.com/">cjqpfjauqswr</a>

ntfhyvcwntfhyvcw2012/01/12 22:54TKFix7 <a href="http://egvshzpudncy.com/">egvshzpudncy</a>

 |