OCaml访问者模式

贝尔和平

我正在OCaml中实现一种简单的类似于C的语言,并且像往常一样,AST是我的中间代码表示形式。由于我将在树上进行很多遍历,因此我想实现一种访问者模式以减轻痛苦。我的AST目前遵循该语言的语义:

type expr = Plus of string*expr*expr | Int of int | ...
type command = While of boolexpr*block | Assign of ...
type block = Commands of command list
...

现在的问题是树中的节点具有不同的类型。理想情况下,我将把处理节点的单个函数传递给访问过程。该过程将打开节点的类型并进行相应的工作。现在,我必须为每个节点类型传递一个函数,这似乎不是最佳解决方案。

在我看来,我可以(1)真正采用这种方法,或者(2)在上面仅使用一种类型。解决此问题的通常方法是什么?也许使用OO?

安德烈亚斯·罗斯伯格(Andreas Rossberg)

没有人在功能语言中使用访客模式-这是一件好事。使用模式匹配,幸运的是,仅使用(相互)递归函数,您就可以更轻松,直接地实现相同的逻辑。

例如,假设您想为AST编写一个简单的解释器:

let rec run_expr = function
  | Plus(_, e1, e2) -> run_expr e1 + run_expr e2
  | Int(i) -> i
  | ...

and run_command = function
  | While(e, b) as c -> if run_expr e <> 0 then (run_block b; run_command c)
  | Assign ...

and run_block = function
  | Commands(cs) = List.iter run_command cs

访问者模式通常只会使这一点复杂化,尤其是当结果类型是异构的时,例如此处。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

python中的访问者模式

来自分类Dev

PHP中的访问者模式

来自分类Dev

专为访问者模式进行循环?

来自分类Dev

来自基类的访问者模式

来自分类Dev

访问者模式:访问相同结构的不同方式

来自分类Dev

访问者设计模式中的方法命名

来自分类Dev

使用访问者模式时如何引用子结果?

来自分类Dev

重载方法分派,没有访问者模式

来自分类Dev

实现C ++访问者模式,避免循环依赖

来自分类Dev

使用多态递归模块创建访问者模式

来自分类Dev

实现调整大小/移动/保存访问者模式

来自分类Dev

C ++访问者模式和多态性

来自分类Dev

仅标题环境中C ++中的访问者模式

来自分类Dev

重载方法分派,无访问者模式

来自分类Dev

使用多态递归模块创建访问者模式

来自分类Dev

在访问者模式中检索类模板的类型

来自分类Dev

不应该重构访问者模式吗?

来自分类Dev

使用访问者模式检查派生类类型?

来自分类Dev

访问者模式:基于输入的数字算术

来自分类Dev

自定义访问者模式实现

来自分类Dev

访问者模式VS迭代器模式:跨层次结构类访问吗?

来自分类Dev

刷新访问者的缓存

来自分类Dev

访问者模式和编译器代码生成,如何处理分配?

来自分类Dev

是否在已知类型的地方跳过“接受”,这是对访问者模式的有效优化?

来自分类Dev

QVariant的访问者模式(无需手动类型测试和转换)

来自分类Dev

如何判断我的网站的访问者是否使用隐身模式?

来自分类Dev

模式访问者:抽象类需要一个功能

来自分类Dev

如何使访问者模式在运行时可配置?

来自分类Dev

如何在C#中逐步解析表达式(最好是访问者模式)

Related 相关文章

热门标签

归档