Javascript Can';t在sweetjs中创建类似haskell的宏

Javascript Can';t在sweetjs中创建类似haskell的宏,javascript,macros,sweet.js,Javascript,Macros,Sweet.js,我想创建一个这样的宏 var diffLength = | index1 === 0 then xPos[index1] | index1 === 2 then (xPos[index1] - xPos[index1 - 1]) * focusFactor | otherwise xPos[index1] - xPos[index1 - 1] 它应该扩展为: var diffLength = index1 === 0 ? xPos[index1] : in

我想创建一个这样的宏

var diffLength =
    | index1 === 0 then xPos[index1]
    | index1 === 2 then (xPos[index1] - xPos[index1 - 1]) * focusFactor
    | otherwise xPos[index1] - xPos[index1 - 1]
它应该扩展为:

var diffLength = 
   index1 === 0 ? xPos[index1] :
   index1 === 2 ? (xPos[index1] - xPos[index1 - 1]) * focusFactor : 
   xPos[index1] - xPos[index1 - 1];
SweetJS代码:

macro |{
    rule { 
      $cond:expr then $check:expr $($guard:(|) $restCond:expr then $restCheck:expr) ... $lastGuard:(|) otherwise $lastCheck:expr
    } => { 
      ( $cond ? $check : $($restCond ? $restCheck :) ... $lastCheck )
    }
}
这只有在我更改$guards:(h)和$lastGuard:(h)而不是$guards:(|)和$lastGuard:(|)以及实际代码时才有效

var diffLength =
    | index1 === 0 then xPos[index1]
    h index1 === 2 then (xPos[index1] - xPos[index1 - 1]) * focusFactor
    h otherwise xPos[index1] - xPos[index1 - 1]
原因是我无法阻止sweetjs解析相邻的“|”(管道)分隔符。
有人能建议我怎么做吗?

我怀疑您的模式的问题在于
是一个合法的JavaScript表达式,因此指定类似
$cond:expr然后$check:expr
的内容将尝试匹配
index1==0然后xPos[index1]| index1==2然后……
等等。如果在每个检查表达式(如逗号)后添加一个符号,它就会起作用。我怀疑您的模式存在的问题是
是一个合法的JavaScript表达式,因此指定类似
$cond:expr的内容,然后$check:expr
将尝试匹配
index1==0然后xPos[index1]| index1==2然后…
等等。如果在每个检查表达式(如逗号)后添加符号,则它会起作用。