gpt4 book ai didi

haskell - Haskell 中有自定义预处理器的示例吗?

转载 作者:行者123 更新时间:2023-12-02 16:14:31 25 4
gpt4 key购买 nike

我已经浏览了 cabal Distribution.Simple* 包,知道 PreProcessor 数据类型可用于定义自定义预处理器。但提供的例子并不是那么有用。我不知道如何调用预处理器。

目前,我只是在 Setup.hs 文件中定义自己的预处理器。

此功能有完整的示例吗?

<小时/>

[已编辑]
检查this我刚刚找到的邮件列表存档。但解决方案涉及从一种类型的文件(由该文件的扩展名标识)转换为另一种类型。

我想要做的是将代码注入(inject)到定义了自定义标记的现有 .hs 文件中,例如

-- <inject point="foo">
-- extra Haskell code goes here
-- </inject>

最佳答案

最重要的事情之一是将 .Cabal 文件中的 BuildType 设置为 Custom。如果停留在 Simple Cabal 将完全忽略 Setup.hs 文件。

Build-Type:     Custom

这是我的包中的一个示例自定义预处理器,它首先运行 cpphs,然后运行 ​​hsc2hs

#!/usr/bin/env runhaskell
> {-# LANGUAGE BangPatterns #-}

> import Distribution.Simple
> import Distribution.Simple.PreProcess
> import Distribution.Simple.Utils
> import Distribution.PackageDescription
> import Distribution.Simple.LocalBuildInfo
> import Data.Char
> import System.Exit
> import System.IO
> import System.Directory
> import System.FilePath.Windows

> main = let hooks = simpleUserHooks
> xpp = ("xpphs", ppXpp)
> in defaultMainWithHooks hooks { hookedPreProcessors = xpp:knownSuffixHandlers }
>
> ppXpp :: BuildInfo -> LocalBuildInfo -> PreProcessor
> ppXpp build local =
> PreProcessor {
> platformIndependent = True,
> runPreProcessor = mkSimplePreProcessor $ \inFile outFile verbosity ->
> do info verbosity (inFile++" is being preprocessed to "++outFile)
> let hscFile = replaceExtension inFile "hsc"
> runSimplePreProcessor (ppCpp build local) inFile hscFile verbosity
> handle <- openFile hscFile ReadMode
> source <- sGetContents handle
> hClose handle
> let newsource = unlines $ process $ lines source
> writeFile hscFile newsource
> runSimplePreProcessor (ppHsc2hs build local) hscFile outFile verbosity
> removeFile hscFile
> return ()
> }

当发现任何扩展名为 .xpphs 的文件时,Cabal 将自动调用此预处理器。

在您的情况下,只需使用 .hs 扩展名注册预处理器即可。 (我不确定 Cabal 是否允许这样做。但如果不允许,您可以简单地将注入(inject)点的文件重命名为 .xh 或其他名称。这实际上会更好,因为您不会处理每个 然后将文件添加到您的项目中)

关于haskell - Haskell 中有自定义预处理器的示例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7370029/

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