mishimaの日記: いまさらだけどスクリプト言語 1
Python はいいね。などとひと月前のレスをフォロー。
いや、ここのところかなり言語を自作したいと思ってて。今更ながら。
個人的な言語の好き嫌いを言わせてもらうと、
sed や awk、perl は好きなほう。
特に perl のルーズさ加減は非常に好き。
ruby は多分合わない (class のある OOL が好きではないんだろう)。
python の言語仕様 (インデントでブロックを表現するとか) は好き。
そんな感じ。
で、ホントは perl を使いたいくらいなのだが、
system() 関数が、気に入らないのだ。
自分の頭には「シェル関数とコマンドを等価に見せたい」というのがある。
しかし、それはその言語の中だけではなくて、外からもそのようでなければいけない。
つまり、perl の中では関数とコマンドは等価になり、
perl の外ではコマンドと perl の関数(全部の関数とは言わないが)が等価になるべきだ。
しかし perl はそのようにはできていない。
で、新たな言語が欲しい、と思っているわけ。
名前は xgsh (じーしぇる)で行こう、と思ってる。
xgsh ではハッシュはこのように書ける:
( KEY1: "VALUE1", KEY2: "VALUE2" )
これは python ぽく。一方リストはこのように書く:
( "VALUE1", "VALUE2", "VALUE3" )
この言語のいいかげんなところはハッシュとリストを混合して書けるところで、その場合は次のように書ける:
( KEY1: "VALUE1", KEY2: "value2", "HOGE", "HUGA" )
関数の引数はこの形で書ける。つまり:
func( KEY1: "VALUE1", KEY2: "value2", "HOGE", "HUGA" )
では、func がもしコマンドだったら?
そのときは次のようなコマンドラインと等価になる:
% func --KEY1=VALUE1 --KEY2=value2 HOGE HUGA
もし、example.xgsh という xgsh のスクリプトがあったとしよう:
#!/usr/local/bin/xgsh
@a = ( "OPT1=", %ARGS["OPT1"], "\n" );
@b = ( "OPT2=", %ARGS["OPT2"], "\n" );
return @a, @b;
このスクリプトをコマンドラインでも呼べる:
% example.xgsh --OPT1=foo --OPT2=bar
また、関数としても呼べる:
#!/usr/local/bin/xgsh
use "/usr/local/bin"
$ret = example( OPT1: "foo", OPT2: "bar" ) # 関数として呼び出し
return $ret
結果はどちらも同じく、
OPT1=foo
OPT2=bar
という出力になる。
xgsh スクリプトをコマンドとして呼び出したとき、
スクリプトの帰り値⇒標準出力、
スクリプトの例外⇒標準エラー出力、
ということでいかがか。
逆にコマンドを xgsh スクリプト内の関数として呼び出すと、
標準出力とエラーコード⇒帰り値、
標準エラー出力⇒例外、
になる。
これだとうまくいかないコマンドがある(例えば find とか)って?
ラッパーをつくりなさい。または、自分で再実装しなさい。
すべての条件を満足するものをつくることには興味はない。
「よく使うもの」が「便利になる」ならそれでいいじゃん。
さらに、「名前空間への新規パッケージ名導入と、環境変数 PATH へ新規パスを追加することは等価」だとか、
「文字列には言語情報がついていて、必要なときに勝手に文字コード変換を行う」とか、
"HOGE" は単なる文字列で、'HOGE' はメッセージカタログがあれば翻訳されるべき文字列、とか、
好きなだけ型変換できるとか。
例)
$HOGE = 3.14;
print $HOGE.string # 文字列として出力
print $HOGE.double # 実数として出力
print $HOGE.int.string # 整数として評価したものを文字列として出力
$HUGA = "日本語"
print $HUGA.eucJP # eucJP として出力
# SJIS に変換した後バイト列にしたものを出力
print $HUGA.SJIS.byte_array
そんなのがフィーチャーかな、と妄想。
どうよ?
Perlとshが合体したような感じが。 (スコア:2)