気になった所を書き留めた
https://hackage.haskell.org/package/whitespace-0.4/src/docs/tutorial.html
ideone (wspace 0.3)
ideoneのエディタ(Ace)で編集すると,入力時にスペースやタブが消えたりするので注意.
brainfuckの似たやつだと思っていましたが,全くの別物で,ネタ言語の割に比較的高度な言語
スタックとヒープを持つ.本家では,多倍長整数が扱える.
ヒープは,適当なアドレスを指定して,読み込んだり書き込んだり出来る.アクセスしたことのないアドレスに対して読み込もうとするとRuntimeError.
- 半角スペース
S
- タブ
T
- LF改行
L
whitespaceは整数の入出力命令を持っている.入力はTLTT
,出力はTLST
.
出力の挙動は素直で,stackPopして出力する.
しかし入力の挙動が厄介で,The read instructions take the heap address in which to store the result from the top of the stack. とのこと.
スタックに乗せるのかと思ったら違った.スタック関連命令以外は,取り出すことしか出来ないと解釈して良さそう?
ヒープのアドレスをstackで指定して,TLTT
は,そのアドレスに読み込む.
次は,標準入力から1つの整数を読み取り,標準出力に読み取った整数を出力するプログラム.
SS SL // stackPush 0
TLTT // inputInt
SS SL // stackPush 0
TTT // heapRetrieve
TLST // outputInt
LLL // exit
0
をS
,1
をT
,終端をL
とする2進数で表現する.先頭は符号ビット.
3はSTTL
,-1は TTL
.
3 を stackPush して,出力するだけのプログラム.
SS STTL // stackPush 3
TLST // outputInt
LLL // exit
ideone (wspace 0.3)
では多倍長整数として扱われる(?).stack,heapに対しても同様.
特記事項なし.サブルーチンスタックは内部実装でしょうか.
- 同じラベルを複数定義する
- 数値
TL
の挙動.-1
だと思うが,0
が得られる.L
はruntime error.
比較ジャンプはスタック先頭を参照する.こちらもpopするので,残したいならduplicateする.