gpt4 book ai didi

haskell - 在解释器中实现命令式返回语句

转载 作者:行者123 更新时间:2023-12-05 01:04:09 25 4
gpt4 key购买 nike

我正在尝试在 haskell 中实现简单的命令式语言。

一般来说,我的程序是一个语句列表(如算术表达式、if/then、块语句)。我的评估器有简单的状态:词法范围堆栈。词法作用域只是变量名到值的映射。当控制流进入函数或块时,我每次都推词法范围,当控制流离开函数或块时弹出。

但是我在尝试实现对 return 的评估时遇到了问题。陈述。
我想要做的是在主评估函数( sources here )中为 return 语句做一个特殊情况:

evalStatements :: [Statement] -> Eval MaybeValue

-- nothing to evaluate
evalStatements [] = return Nothing

-- current statement is 'return expr',
-- evaluate expr and skip the rest of statements
evalStatements (ret@(ReturnStatement _expr):_stmts) =
leaveLexEnv -- leave current lexical scope
evalStatement ret >>= return

-- this is last statement in function, eval it and leave lexical scope
evalStatements [stmt] = do
res <- evalStatement stmt
leaveLexEnv -- leave current lexical scope
return res

evalStatements (st:stmts) =
evalStatement st >> evalStatements stmts >>= return

evalStatement :: Statement -> MaybeValue
evalStatement (ExprStatemet expr) = ...
evalStatement (IfThenStatement expr stmt) = ...

但在 evalStatements 中的特殊情况功能对我来说看起来很难看。这种方法不适用于 BlockStatement , 因为 return语句可以在这个块语句内。
另一个问题是恢复词法范围堆栈,当 return 语句位于多个嵌套块语句中时。

我想我可以通过在我的评估器中存储一些额外的状态来解决这个问题,但这种方法看起来不太好。有些东西告诉我,延续可以在这里帮助我。但我还不太了解延续。

解决这个问题的最佳方法是什么?我只需要一个想法,一般概念。

谢谢。

最佳答案

延续在这里可以工作,但它们太过分了。事实上,对于解决任何特定问题,延续几乎总是矫枉过正。

最简单的解决方案是将必要的逻辑放入您的 Eval类型。如果您制作 Eval包含一个“这个计算用这个值提前返回”的构造函数,然后定义 (>>)(>>=)尊重这一点,一切都会自动解决。

关于haskell - 在解释器中实现命令式返回语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23566824/

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