Befunge 98:来自stdin的eof

时间:2014-04-04 17:40:42

标签: esoteric-languages befunge

遇到EOF时,befunge-98~指令的预期行为是什么?

直观地说,它应该在堆栈上放置-1,但我在这方面发现了一些变化:

  • "直观"方式之后是Befunge-93 JS interpreter。 (以下脚本输出:" -1 -1 97")
  • Michael Riley's interpreter将EOF视为LF字符(ASCII 10),并在读取额外(不存在)字符时将其置于顶部。 (输出:" 10 10 97")
  • Matti Niemenmaa's interpreter也将EOF视为LF,但在读取额外字符时会一直等待用户输入。 (没有输出)

以下是测试:

echo "a" | funge test.fg

test.fg如下(读取三个字符并输出其代码):

~~~...@

实际上是否有正确处理EOF的解释器(即与LF不同)仍然支持完整的befunge-98规范?

1 个答案:

答案 0 :(得分:2)

CCBI遵循规范:

  

如果出现文件结束或其他文件错误,则&和   〜两者都像r。

可以使用其内置的跟踪器/调试器进行验证:

$ echo "~~~...@" > test.fg
$ echo "a" > input
$ ccbi --trace test.fg

Instruction: 126 0x7e '~'
Position: (0,0) -- Delta: (1,0) -- Offset: (0,0)
Stack: 0 cell(s): [  -   -   -   -   -   -   -   -] ""
Tick: 0 -- IPs: 1 -- Index/ID: 0/0 -- Stacks: 1 -- Mode:

(Tracer) stdin < input
Successfully set stdin to file 'input'.
(Tracer) s

Instruction: 126 0x7e '~'
Position: (1,0) -- Delta: (1,0) -- Offset: (0,0)
Stack: 1 cell(s): [  -   -   -   -   -   -   -  97] "a"
Tick: 1 -- IPs: 1 -- Index/ID: 0/0 -- Stacks: 1 -- Mode:

(Tracer) s

Instruction: 126 0x7e '~'
Position: (2,0) -- Delta: (1,0) -- Offset: (0,0)
Stack: 2 cell(s): [  -   -   -   -   -   -  97  10] "a^J"
Tick: 2 -- IPs: 1 -- Index/ID: 0/0 -- Stacks: 1 -- Mode:

(Tracer) s

Instruction: 126 0x7e '~'
Position: (1,0) -- Delta: (-1,0) -- Offset: (0,0)
Stack: 2 cell(s): [  -   -   -   -   -   -  97  10] "a^J"
Tick: 3 -- IPs: 1 -- Index/ID: 0/0 -- Stacks: 1 -- Mode:

(Tracer) s

Instruction: 126 0x7e '~'
Position: (2,0) -- Delta: (1,0) -- Offset: (0,0)
Stack: 2 cell(s): [  -   -   -   -   -   -  97  10] "a^J"
Tick: 4 -- IPs: 1 -- Index/ID: 0/0 -- Stacks: 1 -- Mode:

(Tracer) s

Instruction: 126 0x7e '~'
Position: (1,0) -- Delta: (-1,0) -- Offset: (0,0)
Stack: 2 cell(s): [  -   -   -   -   -   -  97  10] "a^J"
Tick: 5 -- IPs: 1 -- Index/ID: 0/0 -- Stacks: 1 -- Mode:

(Tracer) s

Instruction: 126 0x7e '~'
Position: (2,0) -- Delta: (1,0) -- Offset: (0,0)
Stack: 2 cell(s): [  -   -   -   -   -   -  97  10] "a^J"
Tick: 6 -- IPs: 1 -- Index/ID: 0/0 -- Stacks: 1 -- Mode:

在刻度线3上,增量已从(1,0)更改为(-1,0),即第3列上的~指令(位置(2,0))按预期反映在EOF上。之后,代码会在两个~指令之间进行循环。

您的代码可以修改以检查符合~ - 符合EOF的行为,例如:像这样:

~~#v~...a"tcelfer ton did">:#,_@
   >..a"detcelfer">:#,_@