Skip to content

Instantly share code, notes, and snippets.

@buyoh
Last active August 8, 2018 10:50
Show Gist options
  • Save buyoh/3ba2f0af2ba797aa69fc449e753bc439 to your computer and use it in GitHub Desktop.
Save buyoh/3ba2f0af2ba797aa69fc449e753bc439 to your computer and use it in GitHub Desktop.
print STDIN.read.chars.map{|c| c=='S' ? " " : c=='T' ? "\t" : c=='L' ? "\n" : nil}.compact*""
S_S STL ; stackpush 1
S_S STSL ; stackpush 2
TS_SS ; add
TL_ST ; printint => expected: 3
S_S STSL ; stackpush 2
S_S STL ; stackpush 1
TS_ST ; sub
TL_ST ; printint => expected: 1
S_S STSL ; stackpush 2
S_S STTL ; stackpush 3
TS_SL ; mul
TL_ST ; printint => expected: 6
S_S STTTL ; stackpush 7
S_S STSL ; stackpush 2
TS_TS ; div
TL_ST ; printint => expected: 3
S_S STTTL ; stackpush 7
S_S STSL ; stackpush 2
TS_TT ; mod
TL_ST ; printint => expected: 1
S_S TL ; stackpush 0
S_S TTL ; stackpush -1
S_LS ; stackdup
TL_ST ; printint => expected: -1
S_LT ; stackswap
TL_ST ; printint => expected: 0
S_S STTL ; stackpush 3
S_LL ; stackrem
TL_ST ; printint => expected: -1
S_S SSSSTSTSL ; stackpush 10
TL_SS ; printchar => expected: lf
S_S SSSTL ; stackpush 1
S_S STTTL ; stackpush 7
S_S SSTSL ; stackpush 2
S_S SSSTL ; stackpush 1
TT_S ; heapstore
TT_S ; heapstore
S_S SSTSL ; stackpush 2
TT_T ; heapretrieve
TT_T ; heapretrieve
TL_ST ; printint => expected: 7
S_S STSSL ; stackpush 4
L_SS SSSSL ; label 0
S_LS ; stackdup
TL_ST ; printint => expected: 4,3,2,1
S_S STL ; stackpush 1
TS_ST ; sub
S_LS ; stackdup
L_TS SSSTL ; if top == 0: goto 1
L_SL SSSSL ; goto 0
L_SS SSSTL ; label 1
TL_ST ; printint => expected: 0
S_S STSSL ; stackpush 4
L_SS SSTSL ; label 2
S_LS ; stackdup
TL_ST ; printint => expected: 4,3,2,1,0
S_S STL ; stackpush 1
TS_ST ; sub
S_LS ; stackdup
L_TT SSTTL ; if top == 0: goto 3
L_SL SSTSL ; goto 2
L_SS SSTTL ; label 3
TL_ST ; printint => expected: -1
S_S SSSSSSSTL ; push 1
L_ST STSSL ; gosub 4
TL_ST ; printint => expected: 15
tl_st ; printint => expected: runtime error
LLL ; exit
L_SS STSSL ; label 4
S_S SSSSSSTSL ; push 2
TS_SS ; add
L_ST STSTL ; gosub 5
S_S SSSSTSSSL ; push 8
TS_SS ; add
L_TL ; return
L_SS STSTL ; label 5
S_S SSSSSTSSL ; push 4
TS_SS ; add
L_TL ; return

Whitespace メモ

気になった所を書き留めた

参考

https://hackage.haskell.org/package/whitespace-0.4/src/docs/tutorial.html

環境

ideone (wspace 0.3)

ideoneのエディタ(Ace)で編集すると,入力時にスペースやタブが消えたりするので注意.

ざっと見た所

brainfuckの似たやつだと思っていましたが,全くの別物で,ネタ言語の割に比較的高度な言語

メモリ領域とか

スタックとヒープを持つ.本家では,多倍長整数が扱える.

ヒープは,適当なアドレスを指定して,読み込んだり書き込んだり出来る.アクセスしたことのないアドレスに対して読み込もうとするとRuntimeError.

以降で使う表記

  • 半角スペース S
  • タブ T
  • LF改行 L

1. stdio

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

2. number

0S1T,終端をLとする2進数で表現する.先頭は符号ビット.

3はSTTL,-1は TTL

3 を stackPush して,出力するだけのプログラム.

SS STTL // stackPush 3
TLST   // outputInt
LLL    // exit

ideone (wspace 0.3) では多倍長整数として扱われる(?).stack,heapに対しても同様.

3. subroutine

特記事項なし.サブルーチンスタックは内部実装でしょうか.

4. 未定義?

  • 同じラベルを複数定義する
  • 数値 TL の挙動.-1だと思うが,0が得られる.L はruntime error.

5. jump

比較ジャンプはスタック先頭を参照する.こちらもpopするので,残したいならduplicateする.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment