アットウィキロゴ

OLanguage

O言語がなさそうなのでOtyaLanguage略してO言語
詳細はhttps://github.com/otya128/OL
OだけだとわかりにくいのでOLと書く
標準ライブラリ?
OL::GUIを使ってGUIプログラムも作れる

機能

if expression {...} [ else {...}]
for(state;expression;expression)
while expression
foreach(var name in expression)
break
continue
return
変数宣言
var name = expression
  • 複数の変数は今の所同時に宣言できない
  • 出来るようになった

クラス

class name [ : base class]
  • 継承可能
  • new でオブジェクトを作成
  • newのクラスの後に括弧と引数を付けるとコンストラクタを呼び出す
    • コンストラクタは戻り値を書かないクラスと同名の関数
    • コンストラクタは戻り値を返せる
      • 書いてない場合は暗黙的にthisを返す
      • returnの前に何も書かないときに対策をし忘れた
      • 継承関連で面倒なことになったので無しに
  • new expression[(...)]
  • 親クラスにはbaseで参照する
  • this.baseでも可能
  • this.base.baseでおやおやクラスを参照可能
  • this.staticとするとクラスを取得できる
匿名クラス
  • class [ : base class] {...}で宣言可能
  • 継承元に匿名クラスを使うことは不可
    • 強引に匿名クラスを継承することは可能
var child = new class{};
var parent = class{var hoge;};
child.base = new parent;
child.hoge="A";
print(child.hoge)
  • newと合わせてnew class{...}と使う
  • 匿名クラスはstaticとしても使える
  • むしろその方が余計なオブジェクトは生成されない

配列

  • new Array(要素数)で作成
  • []でアクセスできる
  • 二次元配列は配列の配列で作成する

スレッド

  • C++のライブラリはスレッドセーフじゃなかったりするので予期しない場所で落ちるかもしれない不安定
    • さらにGCが絡むと
  • printなどはlockしてるので大丈夫

Enumerator

  • foreachはこれを呼んでいる(Array以外)
  • Listを巡回するforeach(var a in list){print(a);}は以下のコードと同等
  • ただしチェックは厳しい
  • listの中身がEnumerableじゃない時などはforeachの方が分かりやすい
var enumr = list.GetEnumerator();
while(enumr.MoveNext())
{
	print(enumr.Current())
}

関数

  • 関数は以下の書式で宣言できる
  • var name([var name[,...]]){中身}
  • 匿名関数の場合function([var name[,...]]){中身}
  • 括弧を使って呼び出す
  • 存在しない場合は組み込み関数を当たる
  • 組み込み関数と通常の変数のスコープは違う
  • 明示的に組み込み関数を呼ぶ方法も欲しい
名前付き匿名関数
  • 名前を付けることで再帰が出来る
function fact(x){if(x){return x * fact(x-1);}return 1;}
ラムダ式
  • [(]type] arg[,...[)] => [{...}] | expression
  • 括弧は省略可能
  • 匿名関数を簡単に書く構文
  • {}を付けないと実行できるものは式に制限される
print((x=>y=>z=>x*y*z;)(2)(3)(4))
  • のようにして使う
  • ラムダ式にも名前を付けられる
(fact(i)=>i-1 ? i*fact(i-1):1)
演算子
	static langObject inc(langObject obj1);
	static langObject dec(langObject obj1);
	static langObject bracket(langObject obj1, langObject obj2);
	static langObject bracketequal(langObject obj1, langObject obj2, langObject obj3);
	static langObject bracket(langObject obj1, std::vector<langObject> obj2);
	static langObject bracketequal(langObject obj1, std::vector<langObject> obj2);
	static langObject plus(langObject obj1, langObject obj2);
	static langObject minus(langObject obj1, langObject obj2);
	static langObject unaryplus(langObject obj1);
	static langObject unaryminus(langObject obj1);
	static langObject multiply(langObject obj1, langObject obj2);
	static langObject division(langObject obj1, langObject obj2);
	static langObject greater(langObject obj1, langObject obj2);
	static langObject less(langObject obj1, langObject obj2);
	static langObject greaterEqual(langObject obj1, langObject obj2);
	static langObject lessEqual(langObject obj1, langObject obj2);
	static langObject modulo(langObject obj1, langObject obj2);
	static langObject equal(langObject obj1, langObject obj2);
	static langObject leftShift(langObject obj1, langObject obj2);
	static langObject rightShift(langObject obj1, langObject obj2);
	static langObject _is(langObject obj1, langObject obj2);
	static langObject as(langObject obj1, langObject obj2);


	//ビット演算系
	static langObject _and(langObject obj1, langObject obj2);
	static langObject _or(langObject obj1, langObject obj2);
	static langObject _not(langObject obj1);
	static langObject _xor(langObject obj1, langObject obj2);
	static langObject logicnot(langObject obj1);
	static langObject logicand(langObject obj1, langObject obj2);
	static langObject logicor(langObject obj1, langObject obj2);
	//?=系
	static langObject plusEqual(langObject obj1, langObject obj2);
	static langObject minusEqual(langObject obj1, langObject obj2);
	static langObject multiplyEqual(langObject obj1, langObject obj2);
	static langObject divisionEqual(langObject obj1, langObject obj2);
	static langObject moduloEqual(langObject obj1, langObject obj2);
	static langObject andEqual(langObject obj1, langObject obj2);
	static langObject orEqual(langObject obj1, langObject obj2);
	static langObject xorEqual(langObject obj1, langObject obj2);
	static langObject leftShiftEqual(langObject obj1, langObject obj2);
	static langObject rightShiftEqual(langObject obj1, langObject obj2);
最終更新:2014年03月29日 13:44