- https://github.com/scalaz/scalaz/blob/v6.0.4/core/src/main/scala/scalaz/Name.scala#L99-107
- https://github.com/scalaz/scalaz/blob/v7.0.0-M6/core/src/main/scala/scalaz/Name.scala#L37-L60
- https://github.com/scala/scala/blob/v2.10.0/src/reflect/scala/reflect/internal/transform/Transforms.scala#L9-23
- https://github.com/sbt/sbt/blob/v0.12.1/compile/api/SafeLazy.scala
- https://github.com/okomok/ken/blob/0.1.0/src/main/scala/com/github/okomok/ken/Lazy.scala
- https://github.com/playframework/Play20/blob/2.1-RC1/framework/src/play/src/main/scala/play/api/libs/functional/Util.scala#L3-L11
他にも知ってたら教えて下さい。上記に挙げたのは、ちょっとくらい作りが違ってもすべてcall by need だと思いますが、「これは call by name だよ!」など間違いがあったら教えて下さい。
sbtの実装の場合、以下の行
https://github.com/sbt/sbt/blob/v0.12.0/compile/api/SafeLazy.scala#L21
で、 「値を生成するための関数に対して null を代入」 することにより、それが GC されるようにしてあるという、細かい配慮がされている。
Scala本体のほうのコメントには、 issue5187 objects should override lazy values *1 へのリンクがあり、
「class内のobjectがlazy val を override できるようになれば、こんなことしなくてもすむかもしれない?」
ということだろうか?
*1:このblog書いてる時点では未解決なissue