Befunge 98: eof от стандартного ввода
Каково ожидаемое поведение для ~
инструкция в befunge-98, когда встречается EOF?
Интуитивно понятно, что он должен поместить -1 в стек, но я обнаружил некоторые изменения в этом отношении:
- за "интуитивным" путем следует интерпретатор Befunge-93 JS. (Ниже выводится скрипт: "
-1 -1 97
") - Интерпретатор Майкла Райли рассматривает EOF как символ LF (ASCII 10) и продолжает размещать его сверху, когда читается дополнительный (несуществующий) символ. (Выходы: "
10 10 97
") - Интерпретатор Матти Нименмаа также рассматривает EOF как LF, но продолжает ждать ввода пользователя, когда читается дополнительный символ. (Ничего не выводит)
Вот тест:
echo "a" | funge test.fg
с test.fg следующим образом (читает три символа и выводит их коды):
~~~...@
Существуют ли на самом деле интерпретаторы, которые правильно обрабатывают EOF (т. Е. Отличаются от LF) и поддерживают полные спецификации befunge-98?
1 ответ
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, как и ожидалось. После этого код переходит между двумя ~
инструкции.
Ваш код может быть изменен, чтобы проверить на соответствие ~
-on-EOF поведение, например, так:
~~#v~...a"tcelfer ton did">:#,_@
>..a"detcelfer">:#,_@