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">:#,_@
Другие вопросы по тегам