Альтернатива Scala REPL breakIf в 2.10

Я читал здесь об использовании метода breakIf в REPL код для интерактивной отладки, но затем я нашел этот пост, в котором говорится, что break и breakIf были удалены из ILoop в Scala 2.10. К сожалению, в этом сообщении не объясняется, почему код был удален.

Я предполагаю, что эти функции были удалены, потому что есть лучший способ сделать это. Если это так, не мог бы кто-нибудь просветить меня?


person DaoWen    schedule 17.10.2012    source источник
comment
Почему бы просто не поставить точку останова в Eclipse и не остановить ее там, если вы можете задать ей условия.   -  person James Black    schedule 21.10.2012
comment
@ Джеймс Блэк - Да, если я использую Eclipse, это вариант. Однако я действительно сомневаюсь, что эта функция была удалена из кодовой базы 2.10.   -  person DaoWen    schedule 21.10.2012
comment
Возможно, вы могли бы заглянуть в репозиторий, когда он был удален, и посмотреть, не указали ли они причину.   -  person James Black    schedule 23.10.2012
comment
@ Джеймс Блэк - есть ссылка на коммит в сообщении, указанном выше. Он был удален как часть большого коммита (затрагивающего множество файлов) с сообщением о фиксации Удаление большего количества ненужного кода.   -  person DaoWen    schedule 23.10.2012


Ответы (1)


Может быть, идея в том, что вам нужно просто работать с ILoop напрямую? Насколько я могу судить, это не должно быть намного сложнее, чем:

// insert the code below wherever you want a REPL
val repl = new ILoop
repl.settings = new Settings
repl.in = SimpleReader()
repl.createInterpreter()

// bind any local variables that you want to have access to
repl.intp.bind("i", "Int", i)
repl.intp.bind("e", "Exception", e)

// start the interpreter and then close it after you :quit
repl.loop()
repl.closeInterpreter()

По сравнению со старым breakIf API этот подход избавляется от дополнительного уровня косвенности как для условия if (которое было заключено в => Boolean), так и для _6 _ / _ 7_ (которые были временными оболочками, используемыми только для заполнения аргументов bind).

Этот подход также позволяет вам указать свой Settings по мере необходимости. Например, некоторые ошибки REPL можно обойти с помощью -Yrepl-sync, но break не дает возможности указать это.

person Steve    schedule 06.11.2012
comment
Итак, ответ в том, что они хотят, чтобы мы сами реализовали это заново? - person DaoWen; 07.11.2012
comment
Что ж, я не могу говорить за разработчиков Scala. Но один из ответов может заключаться в том, что он недостаточно гибкий, чтобы его можно было использовать как есть (например, если вам нужен -Yrepl-sync), и, делая его более гибким, было бы так же сложно, просто написание самого кода. - person Steve; 07.11.2012
comment
Тем не менее, лучшее значение по умолчанию для ILoop.settings и ILoop.in сделало бы приведенный выше код гораздо более приемлемым. Меня совершенно не беспокоят звонки createInterpreter, bind, loop или closeInterpreter, поскольку это именно то, что мы пытаемся здесь выполнить. Но устанавливать vars на ILoop кажется неправильным. - person Steve; 07.11.2012
comment
Изначально, когда я попробовал приведенный выше код в 2.10.2, интерпретатор завис. У меня это сработало, так это добавление repl.settings.Yreplsync.value = true - person Ben Hutchison; 05.09.2013