2013-02-14 4 views
3

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

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

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

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

'val x = new X (" x ")' не является простым выражением в Scala и поэтому не может быть возвращено макросом, как вам интересно. Я считаю, что наилучшим подходом к вашему делу является 'val x = city', являющийся _city_ макросом, который указывает имя города, проверяя префикс контекстного вызова. – jeslg

+0

Ops, я ошибался, 'context.prefix' не может получить доступ к имени val. – jeslg

ответ

0

Это может быть решена с помощью 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]-) 
Смежные вопросы