gpt4 book ai didi

functional-programming - OCaml 访问者模式

转载 作者:行者123 更新时间:2023-12-04 16:27:21 25 4
gpt4 key购买 nike

我正在 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)上面只有一个类型。解决这个问题的常用方法是什么?也许使用面向对象?

最佳答案

没有人在函数式语言中使用访问者模式——这是一件好事。幸运的是,通过模式匹配,您只需使用(相互)递归函数就可以更轻松、更直接地实现相同的逻辑。

例如,假设您想为 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

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

关于functional-programming - OCaml 访问者模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22496854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com