2011-08-07
■ [esolang] プログラミング言語Smile (draft 2)
酒を飲みながら考えた結果、いくつか改善点を思いついた。
分岐命令は左端をフラグとすべき
普通の計算は右端を使うことが多いだろうから、フラグは左端から取る方が便利そう。
pop命令はいらない
今回は式を命令の引数にすることは考えてないので、pop命令という名前はおかしくて、discard命令(トップの値を捨てる)にすべきだった。形式はもちろん「:-D」と「D-:」である。
するとpush命令も「:-p p-:」で良さそう (q-: だと点対称になるが、分かりにくいよね)。
比較命令が必要
「<=」のような比較命令か、少なくとも「0以上ならジャンプする」という命令がないといろいろ不便なことに気づいた。
まあBraif*ckに比較命令がないことから分かるように、昨日の内容でも書けないわけではないが:
:-I :-I :-x A B [-: :-x while A>0 ;-) (-; :-x A-1 B-1 {-: :-x when (A-1 == 0) s-: :-x B-1 A-1 {-: :-x when (B-1 == 0) (A==B) :-| (A<B) :-} :-| :-x when (B-1 == 0 and A-1 != 0) (A>B) :-} :-]
長い。
pop命令をなくしたので、
>-: :-< <-: :-> <=: :=> >=: :=< :=)
これが比較で良さそう。「=」は「鼻筋が通った人」です。
注意すべきなのは、比較命令は常に結果を左端に積むこと(分岐で使うため)。
not命令
そういえばなかった。
!-) (-!
または
:-! !-:
まあ前者かな?
関数定義
スタックの両端を入れ替える命令「(:)」(double ended smile)があれば、swap_rightとswap_leftは要らないことに気づいた。
ということは、自分の好きな顔文字を定義できる機能があってもいいかも?
:-s = o-8 (:) 8-o
さらに、上のように定義すると以下の逆操作が自動的に定義されると面白いかも。
s-: = 8-o (:) o-8
「逆操作」というか、単に各命令を字面的に反転させるだけだけど。基本命令が対称に作ってあれば、それで逆操作になる気がする。
命令の文字数は3文字固定にしたほうがいろいろ良さそう。
ライブラリ
となるとstdlibは基本機能の組み合わせとして定義したくて、そうするとなんか外部ソース読み込める機能とか欲しくなる。
<3 ./stdlib.smi
(<3 はハートマークらしい。アーロンさんがよく使ってる)
拡張子は「stdlib.:-)」という案もあるけど…w
引数をとる関数
が定義できるべきかは微妙なところ。引数はスタックから取ってくるのがスタック言語(じゃないけど)らしい気もするし。ただそうするとstdlibの引数とる関数が定義できない。
:-x 上からn番目だけ取り除く命令 X-( <n> = :-x ... Z A B C p-: <n> :-x 3 ... Z A B C {-: :-x when (n != 0) 8-o :-x C 3 ... A B s-: :-x 3 C ... A B (-; 1-) :-x 2 C ... A B :-} :-x 0 A B C ... Z :-D :-x 0 A B C ... D-: :-x A B C ... p-: <n> :-x 3 A B C ... {-: s-: :-x A 3 B C ... o-8 :-x 3 B C ... A (-; 1-) :-x 2 B C ... A :-} :-x 0 ... A B C D-: :-x ... A B C :-.
命令定義は複数行にしたい気がしたので、「:-.」を終端とすることにした(これかわいいな)。
exit命令
そういえばexitがなかった。ByeのBで「B-)」とか? (未だにこの顔文字どういう意味なのか知らないんだけど…)
逆コメント
「:-x」が行末までコメントなのだから、「x-:」は行頭までコメントであるべきだな。
「}-:」の使いみち
「{-: :-}」が分岐なので、「}-:」は「:-}」と同じと見なしてもいいかも。使い分けは気分(文字通り)で。