2016-02-11 6 views
0

Я думаю, что самый большой недостаток программирования в scala заключается в том, что из-за большого количества кода, являющегося частью синтетических/анонимных классов, трассировки стека и журналы «toString» по умолчанию часто близки к бесполезным.scala: toString для синтетических классов и функций

Есть ли веская причина/препятствие для компилятора, генерирующего более полезные имена классов/методы toString? Я чувствую, что методы, связанные с функциями и функциями, назначенными названным vals, по крайней мере, являются хорошими кандидатами для печати имени метода/val вместо «функции». Было бы также здорово, если бы имена классов lambdas отображали название метода, в котором они были определены, но снова что-то вроде «$$ lambda» было бы улучшением.

Возможно, это может быть сделано с помощью макросов - кто-нибудь уже сделал это, или это хороший кандидат, чтобы вникать в макросы scala?

+0

Что вы хотите сказать? В настоящее время это больше похоже на предложение/разглагольствование, а не на реальный вопрос. –

+0

Макросы только ухудшат ситуацию. Вам нужно будет взломать базовую JVM, чтобы исправить трассировки стека. – bash0r

+0

«Кто-нибудь уже это сделал?» И я считаю, что макросы могут по крайней мере добавить более полезную реализацию «toString», если не повлиять на имя сгенерированного класса. Я не знаю, работают ли они чисто локально, или если бы было возможно изменить встроенные классы на именованные объекты – Turin

ответ

1

Существует несколько проблем с этим подходом.

Прежде всего, вы сможете расширить только контекст макроса, то есть непосредственно там, где применяется макрос, поэтому в конечном итоге ваш код должен будет иметь каждую из функций, завернутых в какой-либо метод (который затем расширил дерево, чтобы иметь метод toString), как показано ниже, что довольно уродливо.

val test = Macro.addToString((f: Int) => f + 10) 

Во-вторых, пока вы правы, что в настоящее время функции Scala анонимным, что Внутренние составляющие не собираются быть в случае следующего выпуска, как они будут Java 8 совместимыми. Это означает, что функции расширяются немного по-разному, и я считаю, что вы не сможете использовать этот подход anyway.

Вы можете попробовать использовать плагин-компилятор scala, который, я считаю, будет хорошим способом делать то, что вы хотите.

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