pythonの改良型の新しい言語の提案
pythonは、ステートメントと式が分かれていて、インデントブロックで区切るので、
eval関数で命令を処理できない。(exec関数で処理できるが、インデントの処理が煩い)
命令も全て式とすれば、eval関数で処理できる美しい言語ができる。
CとLISPとPythonを元にして。
CとLISPとPythonのあいの子の書きやすい平易な記述版と思ってくれればよいです。
自分自身をデータとして取り扱えればなお良い。
デザイン草稿 [
式; :: 式; 式;
a = while b == c { 式; 式; }; /* 実行して値を返す */
a = 'while b == c { 式 };'; /* 文字列 */
関数定義は、
a=def func(x,y) { 式 };
マクロ定義は、
a=mac MACRO(X,Y) { (X+Y)*100 };
クラス定義は、
a=class Player { def __init__(self, x) { self.x = x; def func(y) { 式 }}
whileも、defも、macもclassも値を持つ。
自分自身の参照は、
a = 'a'
a = 'a; b;'
a = 'while { 式 };';
eval(a);でaの実行、値を返す。
}のあとの;は省略可。
a = [ 1 2 3 ]; でvector。リストを扱えると良い。
a = load('filename'); /* 自分自身やファイルをデータとして取り扱う。 */
eval(a);
まとめると、
eval(load('filename'));
a=load('filename') /* aにファイルの内容を格納する */
include('filename'); は eval(load('filename')); と等価。
while b==c { 式; 式; }は最後に評価された式の値
while b==c { 式1; } then 式2;は正常終了した場合式2の値 /* Pythonはループ正常終了時のelseとthenが逆なので */
b==cは式で置き換えられる
{ 式; }は、式;
ブロックは、{}で記述
{ 式1; 式2; 式3; } ブロックの値は最後に評価された式の値。分岐がないと式3の値
例えば、
{ 式1; if 式2 then 式3 else 式4 }の値は、式2が真の場合式3、式2が偽の場合は式4
{ switch 式1 { case 式2: 式3 case 式4: 式5 case 式6: 式7 default: 式8 } } は、
式1と式4が等しい場合、switchもブロックも式5の値
チューリング完全で。
書きやすさと美しさの妥協点。
マクロもひっくり込める。
・動的型付けがよい。動的型付けだとバグが出やすいが、書きやすいので。いやしかし、静的型付けの方がコンパイラを書きやすいし、バグが出にくいので、静的型付けのほうが優秀。
・ネイティブコードコンパイラ付きで。ネイティブコードコンパイラ付きだと、プログラムをデータとして扱う場合と動的型付けをする場合、難しくなるので、中間コードコンパイラでも良いかも知れない。
関数の中で関数定義可にして、クラスの中でクラス定義可にして、マクロの中でマクロ定義可にして。
オブジェクト指向も書けるようにして。
スクリプト言語として複数行にまたがる記述も可能にして。
Pythonみたいに初心者も書きやすく。
内包表記も扱えるようにして。
なるべく使わないが、gotoありで。
インデントブロック区分はなしにして。
式だから、書くフォーマットは自由で。
手続き型、関数型、オブジェクト指向型言語の記述もできるように。
エラー処理、Noneの処理もきれいにして。
] デザイン草稿end
LISPほど美しくはならないが、記法として存在してほしい。
string処理を強力にして、データとしての式を加工しやすくする。
参考:
LISPはストリング処理がちょっと弱いような気がします。LISPは完全です。
これが完全なプログラミング言語の一つのモデルの提案です。
手続き型+関数型+オブジェクト指向型、構造化言語の完成された、もっと良い言語処理系がありそうです。探しています。情報を提供していただければ幸いです。どうもこういうのも既にありそうやねえ。
これでできるらしいけど、Pythonでは余計なものがついている。これは、ストリング処理はどうなるのだろうか。