простой scala-макрос

Я хотел бы иметь макрос scala, который делает следующее: Когда я пишу:

myCreateCityMacro("paris")
myCreateCityMacro("vallorbe")

Я хотел бы получить:

val paris = new City("paris")
val vallorbe = new City("vallorbe")

person Eric Mariacher    schedule 14.02.2013    source источник
comment
val x = new X("x") — это не простое выражение в Scala, поэтому макрос не может его вернуть, как вам интересно. Я думаю, что лучший подход для вашего случая - это val x = city, являющийся макросом city, который выводит название города, проверяя префикс вызова контекста.   -  person jeslg    schedule 15.02.2013
comment
Упс, я ошибся, context.prefix не может получить доступ к имени вала.   -  person jeslg    schedule 15.02.2013


Ответы (1)


Это можно решить с помощью динамической функции 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]-)
person Eric Mariacher    schedule 25.02.2014