Skip to content

Latest commit

 

History

History
262 lines (213 loc) · 6.2 KB

ドキュメント.md

File metadata and controls

262 lines (213 loc) · 6.2 KB

T# Documentation

はじめに

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!

"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文

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

N11 を入れて もしリストに N が入ってたら true を返すプログラム

Forループ

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 )
dotruefalse を確認します。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

Append

{ 1 2 3 4 5 6 7 8 9 10 } 11 append

# <配列> <index> append

Read

{ 1 2 3 4 5 6 7 8 9 10 } 0 read println

# <配列> <index> read

readstring にも使えます。

Replace

{ 1 2 3 4 5 6 7 8 9 10 } "Hello World!" 0 replace println

# <配列> <入れ替える値> <index> replace

Remove

{ 1 2 3 4 5 6 7 8 9 10 } 0 remove println

# <配列> <index> remove

Len

{ 1 2 3 4 5 6 7 8 9 10 } len println

# <配列> len

lenstring にも使えます。

ファイル操作

"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"

T# ハイライター

https://twitter.com/m0k1m0k1 さんが作ってくれました!