2011-08-06
■ [esolang] プログラミング言語Smile (draft 1)
講演のために新しい言語を考え中。 処理系は当日作るつもりなんでまだないです。
決まってないことが多いので求む・識者の意見。
プログラミング言語Smile
- dequeベース
- deque→一つの命令(例:add)に対し、add_leftとadd_rightを作りたい
- 顔文字(英語圏の)なら自然にleft/rightを定義できる
- (+: add_left
- :+) add_right
数値リテラル
A案 (大きな数字を書いたときに見づらい?)
-2 (--: -1 (-: 0 (: :) 1 :-) 2 :--)
B案 (正のリテラルが左向きなのがちょっと気持ち悪い?)
-2 :-2 -1 :-1 0 :-0 0-: 1 1-: 2 2-:
C案 (顔文字としてちょっと難がある?)
-2 (-2 -1 (-1 0 (-0 0-) 1 1-) 2 2-)
演算
(+: :+) add (-; ;-) sub (*: :*) mul (-/ /-) div (^% %^) mod
(-| |-) or (-& &-) and (^: :^) xor
deque操作
rotate_rightは、右端の値をpopして左端にpushする。 これがあることで 「上からn番目を取り出す」みたいな操作が書けたり、一時的に値を 「反対側」に退避させたりできる。
:-s s-: swap
:") (": dup
>-: :-< push
<-: :-> pop
o-8 8-o rotate
:-O O-: putn (number -> number) :-o o-: putc (number -> char) :-i i-: in (char -> number) :-I I-: in (number)
命令が引数をとれるようにするかは要検討(rotate_right 3 とか)。
コメント
これはかなり気に入ってるw
:-x single-line comment :-X X-: multi-line comment
制御構造
制御構造に関しては、一方向だけ用意する予定。 つまりdequeの「右端」から値を取り出して、それが0かどうかで判定を行う。
{-: :-| :-} if then endif
あるいは「bool a b if」という語順も考えられるが…
[-: :-] loop
余り
この4つは綺麗に対称なんだけど用途が思いつかない(そしてwindowsだと円マークになる)
:-/ \-: :-\ /-:
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-:」は行頭までコメントであるべきだな。
「}-:」の使いみち
「{-: :-}」が分岐なので、「}-:」は「:-}」と同じと見なしてもいいかも。使い分けは気分(文字通り)で。
2011-08-17
■ [biwascheme][memo] メモ
歯医者で考えたこと
- Interpreter#invoke_closureが値を返すようにするっていうコミットは妥当なのか?
- というのは、proc内でsleepやhttp-requestを呼ぶとまともな値が返せないから
- が、変更としてはいちおう妥当である、という結論に達した
- なぜなら、JavaScript側でクロージャの返り値を見ている時点で、クロージャは同期的に処理を行うことが期待されていると見なせるから
- そもそもJSレベルでもfunction内で$.getとかできないわけだから、「proc内でsleepやhttp-requestを呼ばないで下さい」というのは妥当な制限事項である
スレッドについて
前にTwitterでzickさんにスレッドないのって聞かれて「set-timer!使えば並列に動くようになるよ」って答えた覚えがあるけど。
そのときはデッドロックとかアトミック性を気にしてたんだけど、sleepとか使わない限りスレッド切り替わらないので、アトミック性については問題なさそう。
んでJSレベルではそうなんだけど、同じローカル変数に同時にアクセスしたときになんかまずいことになる(処理系が壊れる)ような例がないかなぁと思ったんだけどよく分かってない。
2011-08-18
■ [esobook][esolang] 『Rubyで作る奇妙なプログラミング言語』絶版記念講演「プログラミング言語はつくれる!」
スライドをアップしました。
今年の冬に新潟大の澤村先生から学生向けに何か話してほしいという依頼があり、初めて90分という長い枠で喋りました。 この公演は 財団法人 新潟工学振興会 の提供でお送りされたようです。よい夏休みの思い出ができました。ありがとうございました。
ライブコーディングは、前回(超交流会)の反省を生かして、どうやって実装するか頭の中で詰めておいたおかげで、文字を出力するとこまですんなり進めることができました。 が、時間が微妙に余ったのでループで数値をカウントダウンするとこまでやろうとして時間切れに。やっぱり実装をちゃんと考えておかないと、時間内に納めるのは難しいですね。
□ 森 [影ながら応援してます。]
□ yhara [おお、ありがとうございます。もうちょっと詰めるかなぁ。]