2013-05-15 92 views
1

有没有一种方法来创建一个阶DSL使我写类似这样的伪代码编码自定义方法签名

编辑:改到斯卡拉伪代码

object AccessProtectedClass extends App{ 
    def protectedMethod(param:String) 
    permit_if (param.startsWith("asdf") and RAM <= 10) : Int = { 
     var result = 10 
     //do something 
     return result; 
    } 
} 

如果由于'permit if'语句而未授予访问权限,应抛出异常。 我需要哪个scala概念?

回答

1

如果我理解正确,基本上permit_if方法只需要一个条件和一个代码块,并且抛出一个不符合条件的异常。 这是平凡的实现如下:

def permit_if[T](condition: Boolean)(f: => T): T = { 
    if (condition) f 
    else throw new Exception("Permit conditions not met!") 
} 

你会使用这样的:

object AccessProtectedClass extends App{ 
    def protectedMethod(param:String): Int = 
    permit_if (param.startsWith("asdf") && RAM <= 10) { 
     var result = 10 
     //do something 
     return result; 
    } 
} 

事实上的标准库中已经包含了方法require检查的要求,所以,除非你需要抛出非常具体的例外,你可能只是使用它。只需在上面的代码片段中将permit_if替换为require即可。

-1

Scala DSLs是有效的Scala代码。你发布的不是。因此,这是不可能的。

+0

thx为提示。更改为scala psydo代码 – fmo

3

可以编写类似于此的代码。有两件事你必须记住:

  • 斯卡拉中缀符号遵循模式obj method param method param method param...,所以你必须将方法名称的关键字放在正确的地方。
  • 运算符优先级可以帮助你或阻碍你。例如,<=and具有更高的优先级,这将有助于您展示的代码段。点符号也是如此。例如,对象后面的括号也可以获得更高的优先级,例如Specs2中的apply方法。

所以,回到这一点:

permit if param.startsWith("xyz") and CPU <= 50 { ... } 

我们可以打破它是这样的:

permit // object 
if  // method, though "if" is a reserved word, so you have to pick something else 
param.startsWith("xyz") // param, because of higher precedence 
and // method 
CPU <= 50 // param, because of higher precedence 
// method needed here! 
{ ... } // param 

所以在我看来,就好像生成器模式将在这里工作,稍作调整。 and(或任何or)的参数可能是名称,所以如果结果由前者定义,则可以避免评估后面的条件。