uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

GStringの評価の仕組み

出遅れてますが、Groovyラボの記事を呼んで、コードレベルでどうなってるかを考えて見ました。

(1)GStringクラスの定義

Groovyのソースを全く見てませんが、おそらく、例えば

class GString {
  List list
  GString(List l) {
    list = l
  }
  String toString() {
    list.collect{it.toString()}.join()
  }
}

(2) GStringの出現

ソース中にGStringが現れたとき、例えば

"AAA${xxx}BBB"

が現れたとき、以下のように置換される。

new GString(["AAA", {xxx}.call(), "BBB"])

$iは${i}と等価と仮定(本当か)。クロージャではあるが、クロージャは即座に評価されるので遅延評価はされていない。

(3)GStringの文字列への変換

GStringオブジェクトが文字列に変換される場合や出力される場合、GString.toString()が呼ばれ、その結果が使用される。


これでだいたい説明がつくかな。
これが遅延評価かというと、ちと違うかなとは思う。

自前でMyGStringを実装してみるのは面白そう。リテラル作るのは、as 演算子をつかってなんとかするとして。