2017-01-26 2 views
1

Иногда в оболочке Erlang, если я ошибаюсь в команде и нажимаю Enter, оболочка переходит к следующей строке в ожидании продолжения команды (поэтому номер строки слева остается прежним).Как я могу выйти из многострочной последовательности команд в оболочке Erlang?

Например, я просто ошибочно (специально) набрал 1> $"X". вместо 1> $X.. После нажатия Enter, теперь командная строка застряла на 1>. Я попытался ввести ., а затем Enter и просто Enter в надежде на завершение последовательности команд, но это не сработает. Хотя я пробовал, очень сложно найти это в Google, потому что невероятно распространенные ключевые слова приводят к другим результатам.

Есть ли способ, которым я могу разбить эту последовательность, не выходя из оболочки полностью с помощью Ctrl C? Проблема с перезапуском оболочки - все переменные теряются.

ответ

3

вы можете нажать Ctrl-G, которая получает вас в «команду переключения пользователя» режим перерыва оболочки этого Эрланга

Стремительное будет меняться от > до --->.

В этом режиме

  • Тип я прервать Эрл сеанс
  • введите с, чтобы подключиться к ней

Эрл оболочка будет состояние выхода исключение: убит и вернуться в состояние, в котором оно было, прежде чем вы застряли.

~ → erl 
Erlang/OTP 19 [erts-8.2] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [dtrace] 

local recon loaded 
local stdlib2 loaded 
Eshell V8.2 (abort with ^G) 
1> $"X". 
1> l 
1> . 
1> . 
1> 
User switch command 
--> i 
--> c 
** exception exit: killed 
1> R=22. 
22 
2> $"X". 
2> 
User switch command 
--> i 
--> c 
** exception exit: killed 
2> b(). 
R = 22 
ok 
3> 
+0

Я всегда использовал^G, чтобы начать новую оболочку в том же узле, я никогда не пробовал команду «i», THX – Pascal

0

Я не знаю универсальный способ, и мне интересно узнать его. С моей стороны я пытаюсь выяснить, что оболочка ожидает, в вашем примере, оболочка «думает», что вы набираете строку:

Первый $" интерпретируется как символ '"', поэтому следующий '"' интерпретируется как начало строки, а оболочка ждет конца строки, прежде чем она начнет интерпретировать следующую точку в качестве конца выражения.

тип "., и вы получите новое приглашение.

Редактировать

При обнаружении ошибки в оболочке непосредственно, перед вычислением выражения, подсказка число не меняется, потому что нет никакого результата для хранения:

1> $"X". 
1> ". 
* 1: syntax error before: X 
1> lists:seq(1,5). 
[1,2,3,4,5] 
2> 

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

2> lists:seq("1","5"). 
** exception error: no function clause matching lists:seq("1","5") (lists.erl, line 243) 
3> 

Результаты каждой оценки хранится оболочки, и он может быть получить с помощью v (N):

3> v(1). 
[1,2,3,4,5] 
4> v(2). 
{'EXIT',{function_clause,[{lists,seq, 
           ["1","5"], 
           [{file,"lists.erl"},{line,243}]}, 
          {erl_eval,do_apply,6, 
            [{file,"erl_eval.erl"},{line,674}]}, 
          {shell,exprs,7,[{file,"shell.erl"},{line,686}]}, 
          {shell,eval_exprs,7,[{file,"shell.erl"},{line,641}]}, 
          {shell,eval_loop,3, 
           [{file,"shell.erl"},{line,626}]}]}} 
5> 
+0

Это, конечно, но без особого успеха, что я пытался сделать. Обычно я отказываюсь после нескольких догадок, чтобы вернуться к задаче. Что касается того, что вы написали, это не сработало сразу, но после нескольких повторов '5> $" A ". 5> ". * 1: синтаксическая ошибка перед: A 5>". 5> ". ". \ N " 6>' Спасибо за помощь в этом выяснить! Кстати, какие-то подсказки, почему я должен был повторить его для оболочки, чтобы, наконец, получить его? – Jordan

+0

Ответ @byaruhaf трюк .. как я сейчас проверил, содержание этого ответа находится в главе 10 книги «Программирование Эрланг» 2-го издания. – Jordan

+0

Я знаю, что мой ответ не является ожидаемым, и меня заинтересовало общее решение : o) – Pascal

Смежные вопросы