groovy+p5

nbqx692007-08-10


前のやつに追記したのだけども、わたすのグルにgroovy+p5のヒントをいただいた。「groovyはrubyとかpythonの影響を受け・・」というのがアタマにあって、そういう思い込みがruby感覚で書くことになりgroovyの仕様やら特徴やらが見えなくなってしまっていたのかも。

ヒントというかメッセンジャ経由でアドヴァイスをもらい、今進めているプロジェクトのsvnレポジトリにサンプルファイルまでコミットしてもらった。ホントにありがたいことだ。以下svn経由でいただいたサンプルを見つつ(つかほぼそのままw)いじったソース。

import processing.core.PApplet
import controlP5.*
import javax.swing.JFrame

class Sketch extends PApplet{
  	def controlP5;
  	def bg = 100;

  	void setup(){
  		size(400,120);
  		frameRate(25);
  		controlP5 = new ControlP5(this);
  		controlP5.addSlider("slider",0,255,bg,40,40,100,10)
  		controlP5.addButton("push",10,0,0,80,20)
  	}

  	void draw() {
  		background(bg);
  	}

  	def push(int theValue) {
  		println("a button event");
  	}

  	def slider(int theValue) {
  		bg = theValue;
  	}

  	void controlEvent(theControlEvent) {
  		println("some control event from "+theControlEvent.controller().name());
  	}
}

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

今回学んだことは

  • public void processing.core.PApplet.setup()なのでdef setup()ではなくてvoid setup()。draw()もまた然り。
  • ExpandoMetaClassで、Sketch.metaClass.setup = {}はムリ。この形だとvoidなメソッドは上書きできないっぽい(classの中で上書き)。
  • metaClassでメソッド定義は「=」が上書き、「<<」が追加。

なんかこれでなんとなく想像なんだけど、jrubyでmouseClickedとmouse_clickedのふたつのメソッドが定義されてるのってjavaでのvoidなメソッドなんかの都合なのかなと思った。jrubyの仕様やらソースを読めばいいのかもだけど。もしrubyやってたひとがエンタープライズ的な用途でjruby on railsとかやりだすとこのあたりハマることが出てくるかもね。

そもそも動的言語をずっとやってて忘れがちなんだけど、静的な型付けってやれば理論上プログラムのスピードが上がるってものだし、jvmで動くスクリプト言語ってある程度の速度を保証するのに見えないとこでこういう部分があるんだろなと思った次第。