Have unlimited dreams.
S-Langはスタックを使用する言語であり,これが言語名の由来になっている。
歴史的経緯により,ポストスクリプト風の言語とC風の言語が混じった言語である。
スタックとは,LILO(後のものが先になる)でデータを操作するデータ構造であり, 関数への引数や戻り値は,スタックに積まれ,取り出される。 これは,関数からの戻り先を覚えておくスタックとは,別物である。 (しかし,エラーメッセージは,どちらもStack?) 残念ならがポストスクリプトをよく知らない。
S-Langでは以下のスクリプトは同じである。
%はコメント
この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)と同等
文字列の連結は、+でできる。
参照渡しをしたい場合は,呼出側で変数に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は,整数,浮動小数点,複素数,そして,文字列の型を定義している。
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という値を持つことができる。 無効な値を示すのに,Null_Typeは使用できる。
言語の特徴の一つに,関数呼出で省略されたパラメータは,NULLに設定される。 foo()パラメータなし, foo(,)はfoo(NULL,NLL)と同等
Null_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とStruct_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]