Я построил REPL для языка в Эрланге. Я запустить его из командной строки, например:Оболочка внутри процесса Erlang печатает входные данные много раз
repl:main(Args).
Она читает с помощью io_getchars
, пока он не встречает ;
, затем разбирает и lexes его:
getchar(eof) -> throw(eof);
getchar([C]) -> C.
getchar() -> getchar(io:get_chars("", 1)).
read_term() ->
case getchar() of
$; -> ";";
C -> [C|read_term()]
end.
Это все хорошо, но взаимодействие с РЕПЛ выглядит следующим образом:
willow% erl -name MyName
Erlang/OTP 18 [erts-7.3] [source] [64-bit] [smp:4:4] [async-threads:10] [kernel-poll:false]
Eshell V7.3 (abort with ^G)
(MyName)1> repl:main(Args).
Master is <0.39.0> in init_workers
1> map(fn(x)=x+1, '[1 2 3 4 5]);
ap(fn(x)=x+1, '[1 2 3 4 5]);
p(fn(x)=x+1, '[1 2 3 4 5]);
(fn(x)=x+1, '[1 2 3 4 5]);
fn(x)=x+1, '[1 2 3 4 5]);
n(x)=x+1, '[1 2 3 4 5]);
(x)=x+1, '[1 2 3 4 5]);
x)=x+1, '[1 2 3 4 5]);
)=x+1, '[1 2 3 4 5]);
=x+1, '[1 2 3 4 5]);
x+1, '[1 2 3 4 5]);
+1, '[1 2 3 4 5]);
1, '[1 2 3 4 5]);
, '[1 2 3 4 5]);
'[1 2 3 4 5]);
'[1 2 3 4 5]);
[1 2 3 4 5]);
1 2 3 4 5]);
2 3 4 5]);
2 3 4 5]);
3 4 5]);
3 4 5]);
4 5]);
4 5]);
5]);
5]);
]);
);
;
Delegated packet 0
Delegated packet 1
Delegated packet 2
Delegated packet 3
Delegated packet 4
(2 3 4 5 6)
2>
Я также попытался:
read_term(Acc) ->
case io:request(standard_io, {get_until, '', scanner, token, [1]}) of
{ok, EndToken={';;', _}, _} -> AcC++ [EndToken];
{ok, Token, _} -> read_term(AcC++ [Token]);
{error, token} -> {error, scanning_error};
{eof, _} -> Acc
end.
И, к сожалению, он имеет такой же эффект.
Я бы предпочел не видеть все возможные правые части струны, которые я ввел. Что вызывает это и как я могу остановить его?
EDIT: Если я запустил его как erl -noshell -eval 'repl:main()'
из оболочки, эта печать не произойдет. Зачем?
Вы забыли включить код? – Dogbert
@Dogbert кричит, мой плохой - добавил. – tekknolagi