首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell中有定制PreProcessor的例子吗?

Haskell中有定制PreProcessor的例子吗?
EN

Stack Overflow用户
提问于 2011-09-10 06:23:54
回答 1查看 812关注 0票数 3

我已经遍历了Distribution.Simple*包,以了解PreProcessor数据类型可以用于定义自定义的预处理器。但提供的例子并不那么有用。我不知道怎么调用预处理器。

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

这个特性有什么完整的例子吗?

编辑的

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

我想要做的是将代码注入到现有的.hs文件中,其中定义了自定义标记。

代码语言:javascript
复制
-- <inject point="foo">
-- extra Haskell code goes here
-- </inject>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-10 09:07:11

要做的最重要的事情之一是将您在BuildType文件中的.Cabal设置为自定义。如果它停留在简单的地方,那么Cabal将完全忽略Setup.hs文件。

代码语言:javascript
复制
Build-Type:     Custom

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

代码语言:javascript
复制
#!/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是否允许这样做。但是,如果没有,您可以简单地用注入点重命名文件为.xh或什么的。这实际上会更好,因为那时您不处理项目中的每个文件)

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7370029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档