Удаление трейлинга ok из io:format в Erlang

Я создаю простую программу крестики-нолики в Erlang. Я передаю доску в виде строки io:format("123\n456\n789\n") и хочу увидеть:

123
456
789

Но в оболочке Erlang io:format("123\n456\n789\n") печатает это:

123
456
789
ok

Есть ли способ вывести на консоль без трейлинга?


person pszals    schedule 04.09.2013    source источник


Ответы (4)


ok говорит вам, что звонок сработал. Это указано в спецификации функции io:format.

Настоящая проблема здесь заключается в том, что вы видите смесь терминала erlang и того, что приходит из stdout — stdout печатает числа, а терминал erlang возвращает ok.

если вы писали скрипт с использованием esscript, то стратегия ok не будет выводиться в стандартный вывод — вы должны просто думать о консоли как об интерактивном интерпретаторе.

В качестве побочного примечания самый простой способ вывода:

123
456
789

Было бы

1> 123. 456. 789.
123
456
789
person Martin Kristiansen    schedule 04.09.2013

Это оболочка печатает последний ok атом. Попробуй это:

erl -noshell -eval 'io:format("123\n456\n789\n"),init:stop()'
person Dmitry Belyaev    schedule 04.09.2013

Оболочка Erlang — это REPL, цикл чтения/оценки/печати. Он читает введенное выражение, оценивает его, печатает результат и выполняет цикл для чтения выражения. Важно помнить, что вы вводите выражение, которое всегда возвращает значение, а оболочка всегда печатает значение. Вы не можете не возвращать значение!

Поэтому, когда вы вводите io:format("123\n456\n789\n")., оболочка оценивает выражение и печатает результат. Вычисление вызова io:format приводит к выводу строки, а вызов возвращает значение ok, которое выводит оболочка. Следовательно, вы получаете

123
456
789
ok

Опять же, оболочка всегда печатает значение, возвращаемое выражением. Если вы вызываете io:format из другой функции, то ее возвращаемое значение обычно не возвращается в оболочку, и оболочка не распечатывает его.

Обратите внимание, что возврат значения и печать чего-либо — две совершенно разные вещи.

person rvirding    schedule 05.09.2013

Вот обходной путь (It's just for fun:)):

> spawn(fun() -> timer:sleep(1000), io:format("123\n456\n789\n") end).
<0.77.0>
123 
456
789
person Ning    schedule 10.09.2013