クロージャをつくるクロージャについて

JSONArrayとしてgrailsに投げられたものをつかって、文字列ベースでクロージャのような形にするクロージャを通します。

def makeClosure = {List args ->
  def ret = ""  

  ##ごにょごにょ
  
  return ret
}

ここで返るのは"{-> ${method_name}(${arg1},${arg2})}"みたいなGString。これにEval.meというフツーは使わんぞこれというメソッドを通してクロージャオブジェクトを作ってます。Eval.meを見つけたときは「やべー」と喜んだものです。

def clo = Eval.me(makeClosure(args))

でもってこれで入れ子のJSONArrayをグルグルと回して、クロージャをつくるクロージャ再帰させて作ったクロージャオブジェクトをmetaClassを介して、PAppletをextendしたgroovyのクラスに当てがうわけです。

ちなみにコンテキスト的な質問もされたので、一応書いておくと、「fill」「background」などは一度だけ実行されるprocessingのメソッドの中につっこまれて、「draw」なんかはフレームの更新時に毎回実行されるところにつっこまれます。

ものすごくシンプルなアイデアです。3分ぐらいで考えたネタだしw ただgroovyで再帰するメソッドの書きかたは勉強になりました。

groovyで再帰するクロージャの書き方

def clo = {stack, list->
      //closure終了条件
      if(!list instanceof List || list.size()==0){
        return stack  
      }
      else{
        stack << list.remove(0)
        return call(stack, list)
      }
    }