kuzha

kuzha には第一級 return は無かったりする

kuzha の前に作っていた tico っていう言語には、第一級 return があった。tico は actor-like なメッセージ送信を計算モデルにしていたから、継続が無駄に扱いやすかったんだよね。 その点、kuzha だと jvm との親和性を重視したから、return は第一級じゃ…

quine

BlockString の処理を少し調整して、quine に挑戦。 s={" "s={\"\n " + s + "\n\"}; " + s puts; "}; "s={\"\n " + s + "\n\"}; " + s puts;

ゆの in kuzha その2

ゆの in kuzha - SiroKuro Page を久しぶりに。あれから半年、文法も色々と変化しました。 X = { s = "ひだまり"; `/` = (|| { s += "スケッチ"; `/` = (|| { s += "x365"; `<` = (|msg| s + msg puts ); }); }); }; X / _ / X < "来週も見てくださいね!";

直った

kz> x = 1; > { x++; x puts; }; > x puts; > 2 2 kz> x = 1; > { x += 2; x puts; }; > x puts; > 3 3

バグ

kz> x = 1; > { x++; x puts; }; > x puts; > 2 2 kz> s = 1; > { s += 1; s puts; }; > s puts; > 2 1

直った

kz> { name = "tama"; } dump; > #object(0x1F1FBA0) { * this = #object(0x1F1FBA0); * parent = #Scope(0x1AAA14A); name = "tama"; } kz> { name = x let x = "tama"; } dump; > #object(0x1837697) { * this = #object(0x1837697); * parent = #Scope(0x…

バグ

kz> { name = "foo"; } dump; > #object(0x3EE284) { * this = #object(0x3EE284); * parent = #object(0x8965FB); name = "foo"; } kz> { name = x /let x = "foo"; } dump; > Exception in thread "main" java.lang.IncompatibleClassChangeError: Class k…

kuzha から他の処理系を呼び出してみる

kz> runScript: "kuzha" {" > "Hello world" puts; > "}; > Hello world kz> runScript: "rhino" {" > print("Hello world\n"); > "}; > Hello world……これは楽しい!

return break、return continue 問題

kz> try > while true do > try > try > break; > finally > "fin01" puts; > end > finally > "fin02" puts; > end > end > finally > "fin03" puts; > end > fin01 fin02 fin03解決

kuzha 1.0 alpha 3 公開

なんとなく作りかけの部分が多いけど、とりあえずコミットしてみた。ヘルプも整備していかなくちゃなぁ……。 Google Code Archive - Long-term storage for Google Code Project Hosting.

return finally 問題

kz> try > try > return 123; > finally > "FIN01" puts; > end > finally > "FIN02" puts; > end > FIN01 FIN02 --> 123解決

TODO

未了 return と finally のコンパイルを作り直す return を areturn じゃなくてリターンシーケンスへ合流する goto にする KuzhaPreprocessor を作る #include #if 〜 #elsif 〜 #else 〜 #end #macro 〜 #end #MACRO_NAME 関数周りの整備 KzJavaFunction に…

try return の話

kz> try > return 123; > finally > "finally" puts; > end > --> 123……あれ?

finally return の話

某所をみて思い出した finally return の問題。まずは finally return から。 kz> try > throw 123; > finally > return 456; > end > --> 456例外が食われた。次は finally break を。 kz> try > throw 123; > finally > break TRY; > end:TRY > Exception …

JavaCC って LookAhead 内は LookAhead を無視するの?

kuzha で x++ って入力するとエラーが出ていた件を詳細に調べてみた。 まず、パーサの基幹部はこんな定義。 Statement CompilationUnit():{ Token start; Statement stt; Expression expr; }{ { jj_ntk(); start = token.next; } ( LOOKAHEAD(Expression() <EOF>)</eof>…

null とオーバーロード(2)

null 自身に型を持たせる方法はお蔵入りすることにしてみた。型持ち null がプログラム内の各所に散らばると挙動が不明になりすぎて困ってしまいます。 その代わり、KzJavaFunction に select メソッドを取り付ける方向で調整します。ある特定のメソッドを取…

null とオーバーロード

kuzha スクリプト内から null を引数に java のメソッドを呼び出すと、そのメソッドがオーバーロードされていたときにどのメソッドが呼び出されるかわからなくなっちゃうので、それを解決しようとあれこれ思案中だったりします。 現在考え中なのが、 null に…

RE: メソッドオーバーロードの動的束縛

cf: メソッドオーバーロードの動的束縛とか - しげるメモ さくっと解決してみた。 import javax.script.*; public class ScriptingDispatch { public static void main(String[] args) throws Exception { ScriptingDispatch obj = new ScriptingDispatch();…

try 〜 finally でちょっと引っかかったところ

try 〜 finally を実装していたら、ベリファイアが Inconsistent stack height を出してきた。何が起きたのかと思ってよく見てみると…… TRY: // try 本体 TRY_END: JSR FINALLY GOTO END CATCH: JSR FINALLY ATHROW FINALLY: ASTORE $EX // finally 本体 RET…

kuzha の後置制御構文

後置制御構文が実装し終わりました。/if /while /for /let /catch /finally /lock /case の7種類があります。 kz> "hi" puts /if 123 == 123; > hi kz> (x = "hi") puts /while x == void; > hi kz> i puts /for i in 0..3; > 0 1 2 3 kz> i puts /let i = …

だいたい変更完了

後置制御構文の文法をちょっと見直し。ついでに /for キーワード追加。あとで /catch, /finally, /lock, /let とかも追加するかも。 kz> i puts /for i in 0..5; > 0 1 2 3 4 5null と void に関係する比較演算子まわりを修正。けど > を ROOT に追加したか…

TODO

未了 case 文のコンテキスト分離 関数周りの整備 KzJavaFunction に select メソッドと callSelect メソッドを新設 無名 KzStruct を許容させる(インデックス演算子とのバッティングをどうするか) KzBigNumber まわりの整備 トレイトをどうするか Converter …

this 引数についてちょっと書いてみる

昨日だか一昨日だかの記事でちょっと出てきた式について解説してみようかなと思い立った。 puts@ obj;これは、変数 obj に入っているオブジェクトの文字列表現を標準出力に出す式です。これに良く似た式は、iolanguage の println メソッドが該当します。thi…

その他の変更予定

そこで今回は、比較演算すべてが可能にしたら良いのではないかと思っている。voidが一番小さく、その次がnull、その次に数値、その次が文字という感じ。 http://d.hatena.ne.jp/nagaShima/20090122/p1 それいいなぁ。頂いちゃおう。kuzha.runtime.Operator#g…

文法変更予定

before Statements := ( ( BlockStatement | ExpressionStatement ";" | ";" ) )* ExpressionStatement := Expression ( ( "@if" Expression | "@while" Expression ) )? | "assert" PrimitiveExpression ( PrimitiveExpression )? | "break" ( <ID> )? | "conti</id>…

for と let 完成

ということで別スコープ版 for 文と let 文を作成しました。 kz> puts@ cnt; > for cnt in 0..5 do > puts@ cnt; > end > puts@ cnt; > void 0 1 2 3 4 5 void kz> puts@ x; > let x = "hello world" in > puts@ x; > end > puts@ x; > void hello world voi…

スコープと無名関数の話(ver俺俺言語)

for 文と無名関数のイディオム - IT戦記 しまった kuzha でも全く同じ問題が出てきてしまう。既存の local を薄くラップして新しい変数を付け加える専用のコンテキストオブジェクトでも作るかな。 問題は sum = 0; for i in 1..9 do sum += i; endの結果、su…

スコープの話

KzInnerContext を作るなら、ちょっとした構文を追加しても良いかもしれないな。 LetStatement ::= "let" <ID> [ "=" Expression ] "in" StatementList "end"let x = 123 in x puts; endみたいな。</id>

処理系と数値演算の話

ある程度自由な型変換を動的にやってのけてしまうような Python とか Perl とか Ruby とかの動的型付け言語で頻出する問題として 『2項演算子の左右の型を揃える問題』 が存在する。 これは、例えば Java とか C/C++ とか C# とか Pascal/Delphi とかの静的…

並列分散の実装予定

受信側 svr = newServer: "127.0.0.1/5678"; act = actor:{ print = {|msg| msg puts; }; }; svr add: "Foo" act;送信側 con = newConnect: "127.0.0.1/5678"; act = con get: "FOO"; act print: "Hello world";みたいな。