kuzha

kuzha 1.0 alpha 1 公開

えー。IE でやったら認証も何も要らずにアップロードできちゃった……。ということで kuzha 1.0 alpha 1 公開ですよ。 Google Code Archive - Long-term storage for Google Code Project Hosting. windows のひと、ダウンロードしたアーカイブ内の kuzha.bat …

kuzha1.0 alpha1 を google code hosting のダウンロードスペースに上げようとしたけど、認証でことごとく弾かれてアップロードできひん。 google のアカウントも google code のアカウントもダメ……ユーザ名とパスワード、何入れればいいんやろか…… orz

puts, pp, dump

kz> "abc" puts; > abc kz> "abc" pp; > "abc" kz> "abc" dump; > "abc" { * this = "abc"; `+` = #fun(String.`+`); `<=` = #fun(String.`<=`); `<` = #fun(String.`<`); `==` = #fun(String.`==`); `>=` = #fun(String.`>=`); `>` = #fun(String.`>`); `^=…

this と super と parent その3

結局こうなるようにしてみた。 kz> this puts; > 3 times:{|| parent.this puts; }; > LOBBY(0x1BEFAB0) LOBBY(0x1BEFAB0) LOBBY(0x1BEFAB0) LOBBY(0x1BEFAB0) parent と書いた場合、this.parent ではなく local.parent を見るようにした expr.this を受け入…

this と super と parent その2

local.super が this と同じって言ったけど、local.superは書き換え可能だったりするのが困りもの。 kz> local.puts = &puts; > puts@this; puts@local.super; > local.super = "hoge"; > puts@this; puts@local.super; > LOBBY(0x1D5550D) LOBBY(0x1D5550D)…

this と super と parent

kz> 3 times:{|| puts@this; }; > 3 3 3 kz> puts@this; > 3 times:{|| puts@local.parent.super; }; > LOBBY(0x1D5550D) LOBBY(0x1D5550D) LOBBY(0x1D5550D) LOBBY(0x1D5550D) kz> pp@local; > #bindings(0xC21495) { * super = LOBBY(0x1D5550D); }3 times…

LL Golf Hole 9 を打ってみるテスト

なんとなく kuzha で挑戦。俺言語だしどう書くのほうにはポストできないなぁ……(^-^; プログラム juse: 'java.io.*' local; juse: 'java.net.*' local; url = jnew: URL 'http://ll.jus.or.jp/2008/blog/archives/38/trackback'; conn = url openConnection; …

ループと else 節

Python で気になっていたループの else 節、よくよく考えてみれば C# で object foo; foreach(object bar in array) { if (bar == baz) { foo = bar; goto SKIP; } } foo = new Object(); SKIP: Console.WriteLine(foo); みたいなのがさくっと書けるのか。言…

ちょっと困ったバグ発見

x++ が x = x + 1; と等価なので、ローカルコンテキストに代入されちゃった例。 kz> x = 1; > 5 times:{|| x++ puts; }; > 1 1 1 1 1本来ならこうしたい。 kz> x = 1; > 5 times:{|| x++ puts; }; > 1 2 3 4 5 関数を渡された 5 オブジェクトが関数起動して…

式の終わりを改行も使えるようにした

これが、 for i in 1..100 do if i % 5 == 0 and i % 3 == 0 then "FizzBuzz" puts; elsif i % 3 == 0 then "Fizz" puts; elsif i % 5 == 0 then "Buzz" puts; else i puts; end endこうでも許容されるようにした。 for i in 1..100 do if i % 5 == 0 and i …

ゆの in kuzha

X / _ / X ゆの in Ruby - 冬通りに消え行く制服ガールは✖夢物語にリアルを求めない。 - subtech なんか感化されたので、空気読まずにゆの in 俺俺言語。 X = { s = "ひだまり"; `/` = fun x { if x == void then this.s += "スケッチ"; else this.s += "x36…

リストと配列参照の文法を修正

list = [1 2 3]; num = list.[1];. に加えて [ 〜 ] にすると配列参照するという仕掛けにしてみた。

eval 外の global を直接書き換えられないようにする

eval 内からの global への書き込みは、シャドウイングすることにしました。 ku> global.foo = "abc"; > global.foo puts; > abc ku> eval: "global.foo puts; global.foo = 123; global.foo puts;"; > abc 123 ku> global.foo puts; > abc

ためしにスレッド使ってみる

ku> juse: "java.lang" local; > run = jnew: Runnable; > run.run = fun { > for i in 0..9 do > i puts; > Thread sleep: 1000; > end > }; > th = jnew: Thread run; > th start; > ku> 0 1 2 3 4 5 6 7 8 9非同期処理も可能そうです。

Class オブジェクトの GC

1千万超えたので中止させた。 間違いなく GC で回収されてるだろうと思う。

そういや Class オブジェクトはちゃんと GC されてるのだろうか

と思ってテストコードをぶん回し中。 juse: "java.lang" local; for i in $[0..] do eval: i + " puts;"; Thread sleep: 1; end何をしているかって言うと、ひたすら eval をぶん回している。 今の kuzha の実装だと、ソースコードは kuzha.code.CodeBlock ク…

Function オブジェクトのフック

ku> func = fun x { > x puts; > }; > local.func.before = fun x { > "before: " + x; > }; > local.func.after = fun x { > "after: " + x; > }; > ku> func: "Hello world"; > before: Hello world Hello world after: Hello worldってな機能を付けようか…

セキュアなオブジェクト

とりあえず SecureWrapper って名前のクラスを作った。で、色んなアクセス制限を考えると、ちょっとした SandBox オブジェクトが作れそうな気がする。結構有意義かもかも。 とりあえず、eval 関数での global オブジェクト保護に SecureWrapper を使うことを…

セキュアなオブジェクト

KuSecureObject っていうセキュアなオブジェクトを用意しようかなーとか考えていたりする。ある特定のコンテキストからの書き込みとか読み込みを制限できるような。 具体的には、ルートオブジェクトは読み書き自由だけど、exec コンテキスト内からは読み込み…

J/Invoke は

最終的にこんな感じに持っていきたいな。 juse: "java.lang.*" local; System.out println: "Hello world";juse: "java.awt.*" local; juse: "java.awt.event.*" local; window = jnew: Frame "kuzha window"; window setSize: 320 240; wls = jnew: WindowL…

Hello world

ku> jclass: "java.lang.System", out, println: "Hello world"; > Hello worldよし、動いたヽ(≧∀≦)ノ

J/Invoke、大方実装完了

java.lang.System.out.println() の呼び出し ku> juse: "java.lang" local; > System.out println: "Hello world"; > Hello world java.awt.Frame を使ってみる ku> juse: "java.awt" local; > juse: "java.awt.event" local; > window = jnew: Frame "Sampl…

ふと気付いたんだけど……

synchronized(this) { if (this.entry != null) return; this.entry = new HashMap<String, List<String>>(); } このコードって、new HashMap が行われるのって常に1回だけってのは保障されるのかなぁ……。</string,>

今後の修正予定

関数定義 現在の文法 void FunctionLiteral():{}{ ("\\" | "fun") FunctionArguments() ( "(" Expression() ")" | "{" StatementList() "}" ) } 新文法 void FunctionLiteral():{}{ "fun" FunctionArguments() ( "->" PrimitiveExpression() | "{" Statement…

今日の変更点

メソッドミッシングに使う forward スロットを、特殊スロットへと格上げ 関数定義を ^ から \ に変更 \x y (x + y) みたいな感じに キーワード引数を | から # に変更 foo# a = 123; みたいな感じに 未評価参照 &var を削除 今後は local.var で代用 余った …

スロットへの代入に関して

obj = {}; obj.foo.bar = "abc";こういうプログラムは、現行の kuzha では foo が void なので VoidOperationException を吐き出してきます。これを、bar スロットへ代入した時点で foo を自動生成するようにするかどうかの思案中。結構手間がかかるんだけど…

オブジェクトのダンプをできるようにした。

ku> neko01 = "tama"; > neko02 = "koma"; > ku> local pp; > #object: e39a3e { neko01 = "tama"; neko02 = "koma"; }んー。やっぱり集合リテラルは要らないかなぁ。

local 特殊変数を作った

ku> test = ^{ name = "tama"; return local; }; > ku> test.name puts; > tama関数とかのローカルコンテキストをそのまま持ち出せます。

for の文法をごにょる

ku> for i = 9 to 0 step 2 do > i puts; > end > 9 7 5 3 1Delphi 風味。こうすると step も自然と書けます。 「 for i in 0..9 do 〜 end 」 とどっちが良いかなぁ。

アドホックな対処法

ku> for i in 0..9 do > i puts; > end > 0 1 2 3 4 5 6 7 8 9とりあえず for 文では、in の後に 「式 ".." 式」 を書けるようにして対処してみた。