6

Why It's Nice to be Quoted を読んで、セクション 3 に準引用符で変数識別子をスプライシングする例があります。

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への再帰呼び出しが の外で行われる理由がわかりました。これは、セクション 3.2[:lam| ... |]の関数が変数名から を構築するためです。antiVarETH.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 に答える