スクリプト言語をつくってみたよ その2

昨日の続きです。
昨日のエントリでは紹介しませんでしたが、そういえば、プロパティにgetter/setterを定義できます!


Propertyというクラス(コンストラクタ)が組み込みで用意されているのですが、こいつにgetter/setterを教えてあげます。

person = {
	_name: 'hoge'
	name: Property({
		get: { 
			print('"get" is called')
			@_name 
		}
		set : {
			print('"set" is called')
			@_name = it
		}
	})
}

次のようなコードを実行してみると...

print(person.name)
person.name = 'foo'
print(person.name)

呼び出し側の記述は通常のプロパティアクセスと変わらないわけですが、次のように出力されます。

"get" is called
hoge
"set" is called
"get" is called
foo

person.nameのアクセスで、ちゃんとgetとsetの関数が呼び出されてますね。


定義が{}と改行でちょっとごちゃごちゃするのが弱点かなー。文の区切りにセミコロンもサポートしているので無理に短くも書けますけど。

person = {
	_name: 'hoge'
	name: Property({
		get: { print('"get" is called'); @_name }
		set: { print('"set" is called'); @_name = it }
	})
}