При замене scala.meta на scala.reflect, что произойдет с тегами классов и тегами типов?

#scala #metaprogramming #introspection #scalameta

#scala #метапрограммирование #самоанализ #scalameta

Вопрос:

Или это вообще актуально?

Я имею в виду использование ClassTag TypeTag аннотаций or, например:

 scala>
import scala.reflect.runtime.universe.TypeTag

def f[T : TypeTag](ls : List[T]) : String = {
  ???
}
  

результаты в :

 f: [T](ls: List[T])(implicit evidence$1: reflect.runtime.universe.TypeTag[T])String
  

Как вы можете видеть, компилятор TypeTag видит, который добавляет неявный аргумент. Есть ли эквивалент в scala.meta ? Как это будет работать, и будут ли какие-либо изменения в способе обработки удаления?

Ответ №1:

На данный момент scala.meta не обеспечивает самоанализ во время выполнения, однако это запланировано для будущих выпусков. API будут похожи на scala.reflect (но с точки зрения scala.meta , например, отличия Abstract Syntax Trees , отсутствия открытых внутренних компонентов компилятора и т. Д.), И я действительно надеюсь, что конечный пользователь не увидит большой разницы.

Таким образом, функциональность ClassTag/TypeTag вряд ли исчезнет. Скорее всего, scala.meta будет использоваться мост ( paradise ) для получения доступа к scalac внутренним элементам (и это включает scala.reflect в себя ).

Также обратите внимание, что это scala.reflect будет поддерживаться в scala 2.x ветке, но не в dotty .