昨日のダダ書きをうけて
昨日散々いろいろ書いて、こんなかんじに落ちつきそう。メソッドの中からもクラスの外からも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をブリブリ書いてた)