variable in string literal
Ruby では #{} が ${} になる。
i@u ~/test/boo> cat lit_var.boo i = 1 print "i = ${i}" i@u ~/test/boo> booi lit_var.boo i = 1
つーわけで Boo Primer はだいたい読んだ。
duck
普段は型推論つきの静的型付け言語で、 as duck とした部分だけ Ruby とか ObejctiveC みたいな世界に突入する、と。
i@u ~/test/boo> booi duck.boo duck.boo(6,9): BCE0019: Boo.Lang.Compiler.CompilerError: 'Length' is not a member of 'System.Object'. i@u ~/test/boo> cat duck.boo i = 1 // i = "1" // これはできない。 i は int になってるから。 o as object = 1 o = "1" // print o.Length // これはできない。 object に size というメソッドが無いから。 d as duck = 1 d = "1" // 大丈夫なのよさ。 print d.Length // 大丈夫なのよさ。 i@u ~/test/boo> booi duck.boo 1
うん素晴らしい。
macro
マクロは自分で C# 書いたら定義できるっぽいのが面白そうなんだけど今やるのはちょとめどい。
http://boo.codehaus.org/Part+17+-+Macros
print, assert, using, lock, debug ってのがマクロだそうだ。 print は print 、 debug は printf デバッグ用の物体の模様。 assert は assert 。
それはいいとして、 using が let で lock が synchronized なわけで、こういうのをマクロにするってのは見たことがなくて、なんか面白い発想だなーと思った。あ、いや、 LISP の発想か。
http://boo.codehaus.org/Syntactic+Macros
with 節を自分で定義とか、実にいい感じ。ああ素敵だ。
generator method
Fiber とか coroutine とかいうヤツ。さっきと等価なもの。
i@u ~/test/boo> cat gen_method.boo def gen(): for x in range(5): yield x*x for i in gen(): print i i@u ~/test/boo> booi gen_method.boo 0 1 4 9 16
高階?ジェネレータを書いてみる。 Enumerable を取ってジェネレータを返すと良い。
i@u ~/test/boo> cat gen_gen.boo def gen(g): for x as int in g: yield x*x for i in gen(gen(gen(range(5)))): print i i@u ~/test/boo> booi gen_gen.boo 0 1 256 6561 65536
generator expression
i@u ~/test/boo> cat generator.boo for i in x*x for x in range(5): print i i@u ~/test/boo> booi generator.boo 0 1 4 9 16
後置 for とかに見えますが、 x*x for x in range(5) が、 generator オブジェクトで、それを巡回している、と。ふむ。
foreach
コンテナから全部取り出すのは for variable in container で良い。
i@u ~/test/boo> cat foreach.boo for i in (1,2,3): print i for i in [1,2,3]: print i for i in {'a':1, 'b':2, 'c':3}: print i.Key print i.Value i@u ~/test/boo> booi foreach.boo 1 2 3 1 2 3 c 3 a 1 b 2
そろそろムラムラと iosh みたいな、補完機能つきのインタラクティブシェルが作りたくなってきました。非常にガイシュツの予感ですが。