2014-10-09 3 views
1

Я создаю инструмент, который получит непредсказуемую структуру данных, и я хочу создать класс case для выполнения структуры полученных данных. Я пытаюсь выяснить, возможно ли создать класс case во время выполнения? Эта структура будет известна только во время выполнения. Это что-то похожее на то, что делает макрос, но во время выполнения. Я нашел этот проект в Интернете mars Это очень близко к тому, что я хочу делать, но я не мог найти, если это было удачным.Scala Metaprogramming at Runtime

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

Кто-нибудь уже сделал что-то вроде создания кода времени выполнения?

Этот вопрос был также размещен в списке scala-user рассылки

ответ

2

UPDATE: (в соответствии с комментариями)

Если все вы хотите выбрасывать код, генерируемый во время выполнения должен быть подан в в библиотеку который не может работать только с списками и картами, а не с кодом, который будет храниться и использоваться позже, было бы разумно искать решения этой проблемы для Java или JVM. То есть, если для библиотеки не требуются некоторые специфичные для Scala функции, недоступные байт-коду vanilla JVM (Scala добавляет некоторые дополнительные функции к байт-коду, который не нужен/имеет код Java).


В чем преимущество динамического генерирования статически типизированного кода? в отличие от использования динамической структуры данных.

Я бы этого не предпринял. Просто используйте структуру, такую ​​как вложенные списки и карты.

+0

Мне нужно создать класс case, потому что мне нужен экземпляр этих данных, который будет использоваться в библиотеке. – dirceusemighini

+1

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

+0

Он будет использоваться и выброшен, мы его не будем хранить. На данный момент они, вероятно, используют отражение и не могут работать в списке. Этот класс используется для создания схемы, которая будет использоваться для запросов и вычислений. – dirceusemighini

1

Генерация кода времени является одной из целей the Mars Project. Марс находится в разработке, на данный момент нет версии выпуска. Марс требует своей собственной инструментальной цепочки для расширения макросов во время выполнения и должен использовать несколько уникальных функций для scala.meta (http://scalameta.org/), например, AST-интерпретация и стойкость AST. В настоящее время мы работаем над проверкой типов AST в scala-reflect, требуемом для расширения макросов во время выполнения.