LiMo WikiWiki page -- Wiki トピック一覧 / 同一トピック掲示板 / 掲示板
編集
掲示板で返信
新規トピック WikiPage の作成

POPL:StackLanguage

Since : Dec.09.2005 18:07'22
LastModify : Feb.02.2006 23:13'36

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


LiMo BBS System - WikiWiki Page
$Id: lmwiki.rhtml,v 1.4 2003/05/17 17:19:11 rero2 Exp $