T#のドキュメントだよ〜 T#はGoʕ◔ϖ◔ʔ で書かれた Forth に似たスタック指向 動的型付け 言語です。
警告! この言語は現在開発中です! 予告なしに使用変更されることがあります。クソコードはなるべく早く書き直します〜
$ git clone https://github.com/Tsharp-lang/Tsharp
$ cd tsharp
$ go build main.go
$ ./main examples/main.tsp
or
$ ./main.exe examples/main.tsp
"Hello World!" println
print
スタックの一番上の値を出力してスタックから除きます。
名前 | スタックの中身 | 説明 |
---|---|---|
dup |
a -- a a |
スタックの一番上の値を複製してスタックに入れます。 |
drop |
a -- |
スタックの一番上の値をスタックから消す。 |
swap |
a b -- b a |
スタックの一番上の値と二番目の値を入れ替えます。 |
print |
a -- |
スタックの一番上の値を出力して drop します。 |
println |
a -- |
print の改行あり |
rot |
a b c -- b c a |
スタックの値上から3つを回転させます。 |
over |
a b -- a b a |
スタックの二番目の値を複製してスタックに入れます。 |
input |
-- <input value> |
他の言語のinput関数です。値はスタックに入ります。 |
exit |
-- |
処理を止めます。 |
free |
a b c -- |
スタックの要素を全て drop 。 |
isdigit |
<string value> -- <bool value> |
スタックの一番上の string型 の値が数字か確認して bool型 をスタックに push 。 |
atoi |
<string value> -- <int value> |
文字列を数値に変換。 |
itoa |
<int value> -- <string value> |
数値を文字列に変換。 |
34 35 + println
T#での計算は全て逆ポーランド記法で書きます。
まず 34
をスタックに入れて 35
をスタックに入れます。
+
はスタックの一番上の値と二番目の値を +
してスタックに入れます。計算に使われた値はスタックから消えます。
print
はスタックの一番上の値を出力してスタックから消します。
他に *
-
/
%
も使えます。
# comment...
int # 1 2 3 4
string # "Hello World!"
bool # true false
list # { 1 2 3 4 }
error # NameError...
type # int string bool list...
block Main do
"Hello World!" println
end
Main
block
は他の言語でいう関数です。
"Hello World!" -> N
N println
スタックの一番上の値が変数に入ってスタックから消えます。変数名は ->
の右側に書きます。
10 -> N # グローバル変数
block Main do
N println
100 -> A # `A` は Main 関数内でしか使用できない。
if true do
A println
end
# `i` は Main 関数内でしか使用できない。
0 for dup 2 < do -> i
i println
i inc
end
end
Main
N println
A println # エラー
i println # エラー
if true do
"Hello World!" println
elif true do
"Hello World!" println
else
"Hello World!" println
end
2 2 == println
2 3 != println
2 3 < println
3 2 > println
2 3 <= println
3 2 >= println
11 -> N
N { 20 30 11 42 28 91 } in
N
に 11
を入れて
もしリストに N
が入ってたら true
を返すプログラム
T# の for
は他の言語の while
です。
for true do
"Hello World!" println
end
0
for dup 100 < do
dup println
1 +
end
上のコードは 1 から 100 まで出力するプログラムです。
最初に 0
をスタックに入れます。
dup
はスタックの一番上の値を複製してスタックに入れます。
今スタックには 0
が二つ入ってます。 ( 0 0 )
100
をスタックに入れます。 ( 0 0 100 )
<
はスタックの一番上の値と二番目の値を使って bool
型をスタックに戻します。0 < 100。
スタックの中身はこのようになります。( 0 true )
do
は true
か false
を確認します。true
の場合はfor文の中身を実行します。
使われた bool
型はスタックから消えます。
false
になるとループが止まります。
0
for dup 100 < do
-> i
i println
i 1 +
end
ちなみに自分はループ処理を書くときはこのように書いてます。
{ 1 2 3 4 5 6 7 8 9 10 } println
{ 1 2 3 4 5 6 7 8 9 10 } 11 append
# <配列> <index> append
{ 1 2 3 4 5 6 7 8 9 10 } 0 read println
# <配列> <index> read
read
は string
にも使えます。
{ 1 2 3 4 5 6 7 8 9 10 } "Hello World!" 0 replace println
# <配列> <入れ替える値> <index> replace
{ 1 2 3 4 5 6 7 8 9 10 } 0 remove println
# <配列> <index> remove
{ 1 2 3 4 5 6 7 8 9 10 } len println
# <配列> len
len
は string
にも使えます。
"main.asm" fopen -> F
"; Hello World!\n" F fwrite
F fread -> context
context println
F ftruncate
F fclose
try
println
except StackUnderflowError do
# do something...
end
StackUnderflowError
スタックに何もないのにスタックの値を使おうとした時
TypeError
型が違う時。
IndexError
配列や文字列のインデックスが違う時。
IncludeError
無効なファイルを Include しようとした時。
NameError
存在しない変数を使った時。
AssertionError
アサーション使った時。
FileNotFoundError
ファイルが見つからなかった時。
false assert "assertion error message..."
include "main.tsp"
https://twitter.com/m0k1m0k1 さんが作ってくれました!