Я хотел бы иметь макрос scala, который делает следующее: Когда я пишу:
myCreateCityMacro("paris")
myCreateCityMacro("vallorbe")
Я хотел бы получить:
val paris = new City("paris")
val vallorbe = new City("vallorbe")
Я хотел бы иметь макрос scala, который делает следующее: Когда я пишу:
myCreateCityMacro("paris")
myCreateCityMacro("vallorbe")
Я хотел бы получить:
val paris = new City("paris")
val vallorbe = new City("vallorbe")
Это можно решить с помощью динамической функции scala:
import scala.language.dynamics
object Cities extends App {
var c = new DynamicMap[String, City]()
createCity("Paris")
createCity("Vallorbe")
println(c.Paris, c.Vallorbe)
def createCity(name: String) {
c.self.update(name, new City(name))
}
}
class City(name: String) {
override def toString = s"-[$name]-"
}
class DynamicMap[K, V] extends Dynamic {
val self = scala.collection.mutable.Map[K, V]()
def selectDynamic(key: K) = self(key)
}
при выполнении:
(-[Paris]-,-[Vallorbe]-)
val x = new X("x")
— это не простое выражение в Scala, поэтому макрос не может его вернуть, как вам интересно. Я думаю, что лучший подход для вашего случая - этоval x = city
, являющийся макросом city, который выводит название города, проверяя префикс вызова контекста. - person jeslg   schedule 15.02.2013context.prefix
не может получить доступ к имени вала. - person jeslg   schedule 15.02.2013