【发布时间】:2021-12-28 23:57:05
【问题描述】:
我在 Haskell 中遇到了一些问题:代码风格和大函数(我将继续通过编写玩具语言来学习 Haskell)。
我有一些必要的大功能(参见示例)。其中有两个子功能(嵌套在哪里)。并且没有理由将其子功能放在模块 scope 中。 “Haskell code-style”或“Haskell code-style best practics”如何解决这个“不优雅和笨拙的代码”问题?
功能(后面有评论):
-- We can delete (on DCE) any useless opers.
-- Useful opers - only opers, whitch determine (directly or transitivery) result of GlobalUse oper
addGlobalUsageStop :: [Var] -> IR -> IR
addGlobalUsageStop guses iR = set iOpers (ios ++ ios') $ set opN opn' iR
where
ios = _iOpers iR
gdefs = _gDefs iR :: M.Map Int Var
opn = _opN iR
guses' = nub $ filter isRegGlobal guses
ogs = catMaybes $ map (concatIOperWithGDef gdefs) $ reverse ios
where
concatIOperWithGDef gdefs' (i, o) = case gdefs' M.!? i of
Nothing -> Nothing
Just gd -> Just (o, gd)
nops = newGUses ogs guses'
where
newGUses [] _ = []
newGUses _ [] = []
newGUses ((Oper _ d _ _, g):os) guses = if elem g guses
then (Oper GlobalUse g (RVar d) None):newGUses os (filter (g /=) guses)
else newGUses os guses
ios' = zip [opn..] nops
opn' = opn + length ios'
注意事项:
-
如果你想知道我为什么要写这么大的函数,答案是: 因为这是一些大的(编译器中需要的功能): - 对于每个“返回变量”,我们应该找到最后一个操作,女巫定义它(实际上是对应的虚拟寄存器),并用构造的操作扩展我们的 IR。
-
我见过一些类似的问题:Haskell nested where clause and "let ... in" syntax 但它们是关于“如何打字正确的代码?”,而我的问题是“这个代码代码样式是否正确,如果不是 - 我该怎么办?”。
【问题讨论】:
标签: haskell compiler-construction