* KH-FDPL に関するメモ-0001 -(by [[K]], 2015.01.07) ** (1) アイデア列挙 -実現できるかどうかはともかくとして、とりあえずこれができるようになりたいと思っていることを列挙してみる。 -(1-1) 変数も構造体オブジェクトも宣言しなくても使える。初出時に宣言される。 --変数宣言のスコープが問題になる。あるループの中で宣言した変数が外からは参照できないのは[[K]]としては望ましくない。かといってグローバル変数をデフォルトにしたいわけでもない。うーむー。 -(1-2) 変数は型を持たない。つまり a=1 のあとに a = "abc" とすることもできる。 -(1-3) 変数や構造体メンバは、未宣言状態に戻すことができる。 -(1-4) 型という概念はない。あるオブジェクトにあるメンバが存在するかしないかだけが問題になる。 -(1-5) プログラムの実行が終了しても、関数やオブジェクトは消去されない。 -(1-6) includeとかrequireみたいな記述をしなくてもよい。 -(1-7) コンパイラであることが理想だけど、とりあえずはインタプリタで始めよう。 -(1-8) KH-FDPLを使ってKH-FDPLを拡張できる(基本構文レベルから改造できる)。 --そんなことができるのかどうかは悩ましいところ。・・・できる気がしてきた。 -(1-9) KH-FDPLを起動すると、前回の終了状態からスタートする。 -(1-10) プログラムはコマンドラインから入力できるが、テキストファイルを読ませることもできる。そうするとバッチファイル的に実行されてプログラムが読み込まれる。 -(1-11) プログラムを文字列に格納しておいて、それを実行することができる。いわゆるevalができる。 -(1-12) 構文ルール上、ここは定数でなければいけない、という部分がない。なんでも変数に代入できるし、なんでも変数で指定できる。たとえばgotoラベルも変数に代入できる。 -(1-13) マルチタスクに動作する。実行中でも変数や関数内容を書き換えられる。 -(1-14) 任意の変数名に対して、それがメンバを持つオブジェクトなのか、配列名なのか、それともただの変数なのか、関数ポインタなのか、未定義なのかを知ることができる。また配列の場合は添え字の範囲を知れるし、オブジェクトの場合はメンバ名の一覧を得られる。 --もっとも配列の添え字の範囲はその時点のものであって、もっと大きな値を指定することはできるし(自動拡張される)、オブジェクトのメンバだっていつでも増やせる。 ** (2) イメージ KH-FDPL version 0.01a OK print a undefined OK a=3 OK print a 3 OK a++ OK print a 4 ** (3) 議論 -(3-1) (1-11)と(1-8)は相性がいいかもしれない。複数のeval関数を書いた上で、プロンプトやファイルで入力したものが、どのeval関数で実行すればいいのかを切り替えさせればいいから。 -(3-2) (1-8)をあてにしてもいいのなら、とりあえずは、ヘボヘボな言語仕様でもよさそうな気はする。 -(3-3) 内部の基本型: --数値型(めんどくさいのでdoubleのみ) ---やっぱりint型も作ることにした。これがないといろいろ不便なので。 --文字列型(長さ情報を持っていて、そのために0x00を内部に含むこともできる) --ポインタ型(別のオブジェクトを指し示すために使う、もしくは関数ポインタとして使う) --オブジェクト型 ---これはKVSの構造を持っていて、配列もこれを使う。構造体オブジェクトとして使う場合はメンバ名がkeyになり、配列の場合は添え字がkeyになる。 --いずれのオブジェクトもIDを持っている。 -(3-4) 変数の内容は文字列型にコンバートできる。ポインタ型やオブジェクト型でもできる。したがって、配列の添え字としてオブジェクト型を指定することもできる。 -(3-5) ++aはa+=1と厳密に同じ結果になる。でもa=a+1は少し違う。もちろん値は同じだけど、a=a+1の場合はオブジェクトが新しくオブジェクトが作られる。つまりIDが変わる。 -(3-5) ++aはa+=1と厳密に同じ結果になる。でもa=a+1は少し違う。もちろん値は同じだけど、a=a+1の場合は新しくオブジェクトが作られる。つまりIDが変わる。 * こめんと欄 #comment