gpt4 book ai didi

haskell - GHC 8.4 系列的插件名称查找行为发生变化

转载 作者:行者123 更新时间:2023-12-03 06:35:17 24 4
gpt4 key购买 nike

[更新:原来这是一个 GHC 错误,现已修复,预计在 8.6.4 版本中发布:https://ghc.haskell.org/trac/ghc/ticket/16104#comment:8 ]

我正在尝试将一个核心插件移植到 GHC 8.6.3,该插件最后在 GHC 8.4 系列上运行良好。不幸的是,我遇到了问题。想知道插件编程要求是否发生了变化,或者这是 GHC 本身的回归。我将其归结为以下示例,并希望获得一些有关如何完成这项工作的指导:

我在文件 TestPlugin.hs 中有以下内容:

{-# LANGUAGE TemplateHaskell #-}

module TestPlugin (plugin) where

import GhcPlugins
import Data.Bits

plugin :: Plugin
plugin = defaultPlugin {installCoreToDos = install}
where install _ todos = return (test : todos)

test = CoreDoPluginPass "Test" check

check :: ModGuts -> CoreM ModGuts
check m = do mbN <- thNameToGhcName 'complement
case mbN of
Just _ -> liftIO $ putStrLn "Found complement!"
Nothing -> error "Failed to locate complement"

return m

我有一个非常简单的 Test.hs 文件:

{-# OPTIONS_GHC -fplugin TestPlugin #-}

main :: IO ()
main = return ()

使用 GHC-8.4.2,我有:

$ ghc-8.4.2 --make -package ghc -c TestPlugin.hs
[1 of 1] Compiling TestPlugin ( TestPlugin.hs, TestPlugin.o )

$ ghc-8.4.2 -package ghc -c Test.hs
Found complement!

但是使用 GHC 8.6.3,我得到:

$ ghc-8.6.3 --make -package ghc -c TestPlugin.hs
[1 of 1] Compiling TestPlugin ( TestPlugin.hs, TestPlugin.o )

$ ghc-8.6.3 -package ghc -c Test.hs
ghc: panic! (the 'impossible' happened)
(GHC version 8.6.3 for x86_64-apple-darwin):
Failed to locate complement

如果我将 Test.hs 更改为:

,问题就会消失
{-# OPTIONS_GHC -fplugin TestPlugin #-}

import Data.Bits -- Should not be required in the client code!

main :: IO ()
main = return ()

也就是说,如果我显式导入Data.Bits。但这是非常不可取的,因为 Test.hs 是客户端代码,并且插件的用户没有理由导入插件出于其自身目的可能需要的所有模块。 (实际上,这需要客户导入一大堆不相关的模块;非常不可行且不可维护。)

我发现了以下堆栈溢出票证,它似乎也遇到了类似的问题:How to replicate the behaviour of 'name in a TH splice然而,答案表明在这种情况下是不行的(也许那里也不是真的行得通),因为在我的情况下,它需要对客户端代码进行不必要的更改,这是不合理的预期。 (也许 @JoachimBretner 有一个想法?)我也将其作为 GHC 票证提交( https://ghc.haskell.org/trac/ghc/ticket/16104#ticket ),但非常感谢来自堆栈溢出社区的反馈。

我应该以不同的方式编码我的插件吗?或者这是 GHC 回归?

最佳答案

不是直接的答案,但是当我需要在 GHC 插件中“硬编码”一个名称时,我不使用 TH。相反,我使用 findImportedModulelookupOrig 来查找它,例如如

lookupJDITyCon :: TcPluginM Class
lookupJDITyCon = do
Found _ md <- findImportedModule jdiModule Nothing
jdiTcNm <- lookupOrig md (mkTcOcc "JustDoIt")
tcLookupClass jdiTcNm
where
jdiModule = mkModuleName "GHC.JustDoIt"

来 self 的代码ghc-justdoit插件。

用户需要提及名称时,我使用模板 Haskell 名称,例如在拼接或注释中,我想在插件中获取它们。这就是我在 inspection-testing 中所做的。我在 appendix of the Inspection Testing paper 中对此进行了一些讨论。 .

关于haskell - GHC 8.4 系列的插件名称查找行为发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53964198/

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