Have unlimited dreams.

S-Langはスタック言語

S-Langはスタックを使用する言語であり,これが言語名の由来になっている。

歴史的経緯により,ポストスクリプト風の言語とC風の言語が混じった言語である。

スタックとは,LILO(後のものが先になる)でデータを操作するデータ構造であり, 関数への引数や戻り値は,スタックに積まれ,取り出される。 これは,関数からの戻り先を覚えておくスタックとは,別物である。 (しかし,エラーメッセージは,どちらもStack?) 残念ならがポストスクリプトをよく知らない。

C風言語の皮をかぶったPostscript(Forth)

S-Langでは以下のスクリプトは同じである。

C風
x=foo(2);
PostScript(Forth)風
2;
foo;
x=();
% x=()は,スタックから一つ取り出し,xに代入する記述
% x=()ではなく,=xという記述もできる(が,,,)

%はコメント

このPostscript(Forth)風の例のように,関数fooの戻り値は,スタックに積まれ, x=()として利用されない限り,そこに残る。

もし,関数fooが,引数を使用せず,戻り値も戻さない次の定義であれば,

  define foo()
  {
  }

x=2となる。

もしも,C言語と思っていると痛い目に会うと思われる。S-Langは, C風言語の皮をかぶったForth(Postscript)である。

()は,引数リストの開始で,指定された引数をスタックに積む,結果は,スタックの トップの値となる。結果が利用されない場合は,スタックに積まれる。 ような動作をする。

言語概要

S-Lang.txtの要約?もどき

変数と関数

宣言していないと使えない。

型チェック,引数チェックは一切?ない。関数と変数で同じ名前は使えない。

関数は,C言語風にも,語(Forthのワード?)のようにしても呼び出せる。 引数の数が違っていても呼び出せる。

   define foo()
   {
   }
   foo();
   foo;
   foo(1); foo(1,2);

再帰

再帰もできる。最初に関数を宣言して、それを関数で利用する。

   define foo(); % 再帰
   define foo(){
     ....
     foo()
   }

余談

関数呼出で省略されたパラメータは,NULLに設定される。

foo()パラメータなし, foo(,)はfoo(NULL,NLL)と同等

文字列

文字列の連結は、+でできる。

参照と逆参照(Referencing and Dereferencing)

参照渡しをしたい場合は,呼出側で変数にprefix &を付ける。 関数側では,Prefix @を付けて,操作する。

define set_xy(x, y)
{
    @x = 1;
    @y = 2;
}
set_xy(&x, &y);

C言語での関数(のポインタ引数)に&でアドレスを渡して,アドレスの指している変数を*で操作するのと同様。

void set_xy (int *x, int *y)
{
    *x = 1;
    *y = 2;
}

S-Langには,静的な型がないので厄介。 参照,逆参照はチェックされているが,代入したとたんに,型がかわるので,注意。

define set_xy(x, y)
{
    x=4;           % この時点でxは参照でなくなる。
    @y=x;
    @x=5;          % エラーになる。
}
set_xy(&x, &y)

配列

多次元配列をサポートしている。 配列に格納する値は,全て同じ型である必要がある。 添え字は0から始まる

S-Langは,範囲配列(range-arry)をサポートしている。 配列を作成する時に,式を指定できる

[1,2,3] %これが配列, 要素は,1,2,3
[3]     %これも配列,要素は,3一つ
[1:5:2] %これも配列(range-arry) [1,3,5]という配列になる
c = [1,2,3] %配列をcに代入
a[[0:1:1]]=[3:5:2];
c=[x*2] % x*2という要素1つ
c=[1:x*2] % x*2個の要素  [1,2,,,,x*2]
c[*]=0;   % 全要素を0に設定

余談

Any_Typeの配列を作ると,どんな型でも格納できる。 (Any_Typeは参照型で,逆参照でアクセスするようだ)

文字列の各文字は,配列のようにして参照できる。更新はできない

連想配列は,Assoc_Typeで作成する

variable A = Assoc_Type [Integer_Type];
A["alpha"] = 1;
A["beta"] = 2;
A["gamma"] = 3;

構造とユーザ定義型

配列は全部同じ型でないといけないが,構造は,いろいろな型を要素にできる。

まず,構造を定義して,逆参照で変数に代入する。 (構造で構造の構造を定義して,逆参照を変数に代入することで,構造の領域を確保する)

typedefで構造に型名を付けることができる。 型名をつけると,配列を作成できる。関数で構造の作成,初期化もできる。

typedef struct
{
    first_name, last_name, age
}
Person_Type;

名前空間

グローバルな名前空間(ネームスペース)と, 各ユニット(ファイル等)毎の名前空間がある。

staticキーワードを使用した変数,関数は,各ユニット毎の名前空間と 関連付けられる。

->オペレータにより,名前空間のオブジェクトにアクセスできる。

->オペレータは,名前空間のオブジェクトにアクセスするために,名前空間の名 前とともに使用される。グローバルな名前空間のiにアクセスするには, Global->i

通常各名前空間には名前がない。implements関数により名前を与えることができる。

 implements ("A");
 static variable i;
 ... ---- ...
 A->i

データ型とリテラル

現在のS-Langの実装では,256の型を許す。 さらに,typedefを使用して,新しい型を作れる。 (typdefが256に入るかどうかはよくわからない)

定義済みのデータタイプ

現在のS-Langは,整数,浮動小数点,複素数,そして,文字列の型を定義している。

整数:Integers

S-Langは,符号付,符号なし文字,短い整数,長い整数,そして, プレーン整数(plain interger)の整数をサポートする。 システムによっては,短い整数,長い整数に違いがないかもしれない。

プレーン整数リテラルはいくつかの方法で指定できる。 10進: 127 16進: 0x27 8進: 0177

短い,長い,符号なしは,接尾語により指定できる。L 長い,h短い,U符号なし 文字リテラルは,'a'のように記述できる。範囲は,0-256。ASCIIと同じ。 i='0'; iは'0'文字のASCIIの値である48になる。 "-"が頭につくかもしれない。

浮動小数点

担精度,倍精度の浮動小数点のリテラルは,小数点か指数(または両方)を含む。 例: 12. 12.0 12e0 1.2e1 12は浮動小数点ではない。整数。 担精度を示すため接尾語fが

複素数

複素数は,倍精度の浮動小数点のペアとして実装されている。 複素数は,実数と虚数の和として見なされる。 虚数のリテラルは,数字の最後にiまたはjを付加して表す。 12i 12.0i 12e0j 全て同じ虚数12iを示す。 総括的な複素数は,和によってあらわされる。 3.0+4.0i 実数部が3.0,虚数部が4.0 組込関数RealとImagは,それぞれ,実数部と虚数部を取り出すのに使用できる。

文字列

文字列は,二重引用符(")で囲む。 文字列の長さに制限はないが,文字列リテラルは,256文字未満である。 文字列の連結により,この制限を越えれる。 "This is " + "and ."

改行(newline, ASCII 10)とヌル文字(ASCII 0)以外の文字は,文字列リテラルに 現れてもよい。しかし,次の仕組みを使用してもよい。 バックスラッシュは,特別な文字で特別な文字を表すのに使用される。

     \\    -- バックスラッシュ
     \"    -- "
     \xhhh -- 16進表記
     その他(\', \a, \t, \n, \e, \ooo, \dnnn)

Null_Type

Null_Typeは,ただ,NULLという値を持つことができる。 無効な値を示すのに,Null_Typeは使用できる。

言語の特徴の一つに,関数呼出で省略されたパラメータは,NULLに設定される。 foo()パラメータなし, foo(,)はfoo(NULL,NLL)と同等

Null_Typeは,構造に重要な役割を演じます。

Ref_Type

Ref_Typeは,単項演算子&を使用して作成されます。逆参照演算子@を使用して,逆参照されるかもしれない。

例:
             variable sin_ref = &sin;
             variable y = (@sin_ref) (1.0);

sinの参照を作成し,sin_refに代入する。sin_refを逆参照し,sinを呼ぶ。

Ref_Typeは,関数を引数として渡す時またはパラメータリストに情報を戻す時便利です。逆参照演算子は,これらから実体を作成する時に,使用されます。 これらの理由により,Ref_Typeは重要です。

Array_Type and Struct_Type

Array_TypeとStruct_Typeはコンテナーオブジェクトとして知られています。 ここまで議論した単純なデータ・タイプよりはるかに複雑です。 また、各々は特別のシンタックスに従います。

DataType_Type Type

S-Langは、DataType_Typeと呼ばれるタイプを定義します。

このタイプのオブジェクトは、タイプ名の値を持っています。 例えば、整数はInteger_Typeのオブジェクトです。DataType_Typeのリテラルは次のも のを含んでいます:

            Char_Type            (signed character)
      ... 型省略...

定義する他のタイプの名前も同様。

組み込み関数typeofはその引数のデータ・タイプを返します。DataType_Type, 例えば、typeof(7)はInteger_Typeを返します。また、typeof(Integer_Type)はDataType_Typeを返します。

次の例でのようなこの機能を使用することができます:

      if (Integer_Type == typeof (x)) message ("x is an integer");

最も一般的な用途の1つは配列を作成することです。


%はコメント

無保証

motto: みんなに感謝,あなたに感謝 (next:為に生きる Rev.S.M.ムーン)

I am grateful to everyone and you.

mizotec@nifty.com
[up]