Avatar
omochimetaru 11/9/2017 3:23 AM
protocol ASTNode : CustomStringConvertible { func accept<V: ASTVisitor>(visitor: V) -> V.VisitResult } protocol ASTVisitor { associatedtype VisitResult func visit(nop: NopNode) -> VisitResult func visit(text: TextNode) -> VisitResult func visit(code: CodeNode) -> VisitResult func visit(subst: SubstNode) -> VisitResult func visit(macroCall: MacroCallNode) -> VisitResult func visit(macroStringLiteral: MacroStringLiteralNode) -> VisitResult func visit(template: Template) -> VisitResult } (edited)
3:23 AM
Visitorパターンの素体を protocol で組めて、 associatedtype で返り値の型もジェネリックにできて、ここまでは良かったんだけど
3:23 AM
throws / rethrows が適用できない事に気がついた・・・
3:24 AM
もし Node に渡す Visitor が 例外を投げうるVisitor であれば、 Node.acceptは throws になってほしい。
3:25 AM
ASTThrowableVisitor protocol を定義して accept をオーバーロードすればいけるか・・・?
3:25 AM
全部のノードに accept の実体を2倍かかないといけないけど。