POPL:StackLanguage

過去の記録を閲覧用に保存しています。投稿・編集はできません。一部の旧記法・画像や HTML の表示は再現されていません。同名ページは候補から選択してください。

POPL:Top

ういかのロジック部分。



StackLanguage とは


ういかがまがりなりにもプログラム言語を名乗るために、裏の方では簡単なインタプリタ言語を動作させます。その言語が StackLanguage です。

ういか自身は StackLanguage を対話形式で扱うためのインターフェースと言えるかもしれません。



StackLanguage はその名の通りスタック型のプログラム言語です。

ぶっちゃけ FORTH なんですが、心底簡単なワードしか持っていなかったり、ういかのために通常の FORTH と違う所もあるので敢えて別物としておきます。



なんか名前を付けた方が良いかも。



StackLanguage の使い方


通常はういかが居るので StackLanguage を意識することはありません。

ういかのソースコードを入手すると、デバッグ開発用の対話型インタプリタコマンドインターフェースである check.rb が付いてきます。

% ruby check.rb とかやって起動すると StackLanguage を直接叩けます。

物好きなお方向け。



check.rb の機能


ruby で書かれています、ruby で起動して下さい。

% がプロンプトです。適当なワードを入力するとスタックに積まれたり、実行されたりします。ワードはスペースで区切って複数個入力することもできます。

プロンプトに 'quit' と入力すると終了します。



StackLanguage 概要


数字、命令、文字列といったスペースを含まない要素ひとつを「ワード」といいます。

数字や文字列といったワードを入力していくと、それらはスタックに積まれていきます。ワードは最も最近積んだ物から使われます。

; % 1 2 3

; stack: 1 2 3

3つのワード(数字)がスタックに積まれました。

この状態で '.' (ドット、スタックから1つ取り出してそれを表示する)を実行すると、'3' がスタックから下ろされてスタックには 1 2 が残ります。



Hello World !


; HelloWorld! .



Deep loop 回避


ユーザーワード登録が行えることでプログラミングができるようになりますが、それと同時に無限ループの可能性も発生します。

; : infloop infloop ;

; infloop

これは自己呼び出しを無限に続けます。

; : hoge moga ;

; : moga hoge ;

; moga

これは二つのワードを交互に呼び合いますが無限ループを構成しています。

無限ループでなくても過度のループでマシンリソースを消費する恐れもあります。

こういった Deep loop を回避するため、ユーザーワード実行時はワードコールを数えて一定数以上(100とか)呼ばれたらエラーを出してギブアップする仕組みを入れてあります。



結果大規模プログラミングはできません。

WEBで公開するための措置とお考え下さい。



StackLanguage リファレンス




StackLang Lv1


:clear:スタックを全て消去します

:.:スタックからひとつ取り出し、コンソールに表示します

:dup:スタックに積まれている要素をコピーしてスタックに積みます、結果ふたつにふえます

:drop:スタックからひとつ取り出し、捨てます、何もしません

:swap:スタックの一番上にあるワードと二番目にあるワードを入れ替えます

:+:スタックの一番上にある数字と二番目にある数字を加算して結果を積みます

:-:スタックの一番上にある数字と二番目にある数字を減算して結果を積みます

:*:スタックの一番上にある数字と二番目にある数字を乗算して結果を積みます

:/:スタックの一番上にある数字と二番目にある数字を除算して結果を積みます

:%:スタックの一番上にある数字と二番目にある数字を除算した余りを結果を積みます

:rand:スタックの一番上にある数字を取り出し、0からその数字の間の整数をランダムに発生して積みます

:true:真を意味する値です

:false:偽を意味する値です

:==:スタックの一番上にある数字と二番目にある数字を比較し、同じだったら true そうでなかったら false を積みます

:!=:スタックの一番上にある数字と二番目にある数字を比較し、違っていたら true そうでなかったら false を積みます

:<:スタックの一番上にある数字と二番目にある数字を比較し、二番目の方が大きかったら true そうでなかったら false を積みます

:>:スタックの一番上にある数字と二番目にある数字を比較し、一番目の方が大きかったら true そうでなかったら false を積みます

:if endif:スタックの一番上にある値が true もしくは 0 以上であったら if〜endif の間にあるワードを実行します

:if else endif:スタックの一番上にある値が true もしくは 0 以上であったら if〜else の間にあるワードを実行、false もしくは 0 であったら else〜endif の間にあるワードを実行します

:cr:改行コード



StackLang Lv2


:::ワード登録開始位置です

:;:スタックの一番上にある文字列をワード名として、ワード登録開始位置からここまでのワードをユーザーワードとして登録します

:face:スタックの一番上にある文字列を取り出し「表情コンソール」に積みます、表情コンソールがどう使われるかはインターフェース層の実装に因ります