简单的斯卡拉宏观

问题描述:

我想有一个阶宏,执行以下操作: 当我写:简单的斯卡拉宏观

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

我想获得:

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

'val x = new X(“x”)'在Scala中不是一个简单的表达式,因此,如果您想知道,不能由宏返回。我认为你的情况最好的办法是'val x = city',它是一个通过检查上下文调用的前缀来推断城市名称的宏。 – jeslg 2013-02-15 13:46:27

+0

Ops,我错了,'context.prefix'不能访问val的名字。 – jeslg 2013-02-15 15:05:31

这可以使用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]-)