6

通读Why It's Nice to be Quoted,在第 3 节中,有一个在 quasiquote 中拼接变量标识符的示例。

subst [:lam | $exp:e1 $exp:e2 |] x y =
    let e1' = subst e1 x y
        e2' = subst e2 x y
    in
        [:lam | $exp:e1' $exp:e2' |]

我明白为什么递归调用subst是在外部完成的[:lam| ... |],这是因为第 3.2 节中的函数从变量名中antiVarE构建了TH.varE

我的问题是需要多少工作才能支持除了变量名之外的任意表达式拼接?

例如:

subst [:lam | $exp:e1 $exp:e2 |] x y =
      [:lam | $exp:(subst e1 x y) $exp:(subst e2 x y) |]
4

1 回答 1

2

为后代回答我自己的问题。

原来这很简单。使用haskell-src-metaparseExp包中的函数,我能够轻松地将字符串转换为 AST 片段。

在原始论文中,除了捕获括号之间的表达式字符串所需的解析器更改之外,该antiExpE函数可以这样重写。

antiExpE :: Exp -> Maybe TH.ExpQ
antiExpE (AE v) =
    case parseExp v of
        Right exp -> Just . return $ exp
        Left _    -> Nothing
antiExpE = Nothing
于 2013-01-27T04:00:35.573 回答