昨日のダダ書きをうけて

昨日散々いろいろ書いて、こんなかんじに落ちつきそう。メソッドの中からもクラスの外からもupdateてメソッドを介して挙動を変更する的な。とりあえずgroovyからp5を叩くスクリプツでプロトタイピング。

import processing.core.PApplet
import processing.core.PFont
import javax.swing.JFrame

class Sketch extends PApplet{
	ExpandoMetaClass exp
	PFont font
	def mode
	def val
	
  void setup(){
    size(100,100)
		
		mode = 0
		val = 0
		
		font = createFont("Courier",18)
		background(255)
  }
  
  void draw(){
		smooth()
		textFont(font,18)
    text(val.toString(), 50, 60)
    fill(0)
  }
	
	void mousePressed(){
		def clo
		
		if(mode==0){
			mode = 1
			clo = {-> return val = val+1}
			println "incremental"
		}else{
			mode = 0
			clo = {-> return val = val-1}
			println "decremental"
		}
		
		this.update("tap",clo)
	}
	
	void keyPressed(){
		background(255)
		tap()
	}
	
	def tap(){
		println "init!!"
	}
	
	def update(String name, Closure clo){
		exp = new ExpandoMetaClass(this.class,false)
		exp."${name}" = clo
		exp.initialize()
		this.metaClass = exp
	}

}

def jframe = new JFrame(title:"Test",resizable:true,defaultCloseOperation:JFrame.EXIT_ON_CLOSE)
def app = new Sketch()
jframe.add(app)
app.init()
jframe.pack()
jframe.visible = true

//もつろんこれでもいける
/*app.update("tap",{-> 
	println "good bye"
	background(128)
})*/

マウスクリックする度にキーボードのなんかのキーを押したときのメソッドが「足し算」と「引き算」でトグルする。あんまりクラス内部からの変更だけだとつまらないんだけど、groovysh上からざくっと挙動が変わったらおもろいかもね(試してないけどタブンいける)。

あとはgroovyのクロージャをピリオドつなぎしていって、lispのマクロっぽく構造変更してあげてevalできるような仕組みをかんがえる予定。できるかわからんけどできたらカッコいいと思う、そしてワンライナーでいろんなこと書けるのではないかと期待ふくらむ今日この頃です。

あーこのまえのgrailsコードリディング行きたかったなー DSLの話だったもんなー 「lispのマクロっぽいことしたいんです!!」とか言ってみたかったなー (その日はrailsのobserverをブリブリ書いてた)