当使用模板haskell读取的文本文件发生变化时,如何强制Stack重新编译?

kiz8lqtg  于 2023-01-21  发布在  其他
关注(0)|答案(1)|浏览(120)

我目前正在为xmonad编写一个配置,我想做一个可变的颜色主题配置,所以我把每个颜色主题做成一个类型,例如data Dracula = Dracula,和一个Color类型类

class ColorTheme a where
  colorWhite::a->String
  colorWhite = const "#ffffff"
  -- rest of the colors

现在我想改变颜色主题然后使用一个dmenu脚本,脚本将写入到一个文本文件中选择的颜色主题名称,每个名称是字符串表示的主题类型名称。
使用模板haskell,我能够将字符串读入构造函数名,例如
x一个一个一个一个x一个一个二个一个x一个一个三个一个
问题是堆栈在theme.txt更改时不会重新编译,我从Language.Haskell.TH.Syntax模块中读到了addDependentFile,但我不知道如何使用,也没有找到任何教程,还有,关于相同问题的问题,无论是在使用GHC时,还是在没有书面示例的情况下被提示使用addDependentFile
我试着写一些

--xmonad.hs

main :: IO ()
main = (xmonad . withSB mySB . docks . ewmhFullscreen . ewmh $ defaults) 
 >> (runQ $ addDependentFile "/absolute_path/to/theme.txt")

抛出异常,Q单子不能在IO单子内部调用。
所以,如果有人可以使用addDependentFile,你会提供一个简单的例子如何使用?
GHC版本:9.2.4堆栈版本:2.9.1

    • 夏立耀解决方案的工作版本**
retrieveThemeName :: Q Exp
retrieveThemeName = do
  addDependentFile "/absolute_path/to/theme.txt"
  runIO $ do
    handle <- openFile "theme.txt" ReadMode
    name<-hGetLine handle
    return $ LitE (StringL name )
theme = $(conE (mkName $(retrieveThemeName) ))
mqkwyuun

mqkwyuun1#

你可以在一个splice($( ... ))中调用addDependentFile。下面是你如何在需要这个文件的action旁边调用它:

retrieveThemeName :: Q String
retrieveThemeName = do
  addDependentFile "/absolute_path/to/theme.txt"
  runIO $ do
    handle <- openFile "theme.txt" ReadMode
    name <-hGetLine handle
    return name

我还删除了一些不必要的引用,你可以这样称呼它:

theme = $(conE =<< (mkName <$> retrieveThemeName))

相关问题