我正在研究DSL,我遇到了使用方法作为链中的中缀运算符的问题.我将尝试用一些代码来解释它.我有一个特质Term和案例类Literal并Variable扩展它.我想使用一些运算符构造一个术语实例列表.
case class Expr(val terms: List[Term]) {
def +(v: String) = Expr(Literal(v) :: terms)
def -->(func: List[String] => List[String]) = terms match {
case Literal(v) :: ts => Expr(Variable(v, func) :: ts)
case _ => throw new Exception("Can only apply function on literal")
}
}
object foo {
def bar(name: String) = Expr(Literal(name) :: Nil)
}
// some functions
val one = ...
val all = ...
// works
foo bar "x"
// res1: …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用简单的对象数组中的jade渲染表.但是,我不想简单地为每个对象渲染一行,而是想在每一行上渲染三个对象.
<table>
<thead>...</thead>
<tbody>
<tr>
<td>obj0</td>
<td>obj1</td>
<td>obj2</td>
</tr>
<tr>
<td>obj3</td>
<td>obj4</td>
<td>obj5</td>
</tr>
...
</tbody>
</table
Run Code Online (Sandbox Code Playgroud) 我有一个函数,我知道是尾递归.但是由于我定义它的方式,编译器抱怨函数在非尾部位置具有递归调用.这是功能.
@tailrec
def travel: (Int, List[Char]) => Int = {
case (n, Nil) => n
case (n, '~' :: sls) => travel(0, sls)
case (n, '^' :: sls) => travel(max(n-1,0), sls)
case (n, '>' :: sls) => travel(n+1, sls)
case (_, s :: sls) => throw new IllegalArgumentException("Illegal selector '" + s + "'")
}
Run Code Online (Sandbox Code Playgroud)
我明白了
error: could not optimize @tailrec annotated method travel: it contains a recursive call not in tail position
def travel: (Int, List[Char]) => Int = …Run Code Online (Sandbox Code Playgroud)