Haskell GHC版本签入代码
我正在为它做贡献,它显然依赖于很多库,并且应该编译很多版本 我需要使用GHC 7.6.1中提供的函数来更好地处理错误。因此,我想使用Haskell GHC版本签入代码,haskell,ghc,Haskell,Ghc,我正在为它做贡献,它显然依赖于很多库,并且应该编译很多版本 我需要使用GHC 7.6.1中提供的函数来更好地处理错误。因此,我想使用#if…导入所述函数,否则,我将以不同的方式处理错误 我看到了一些: #if __GLASGOW_HASKELL__ >= 610 import Control.Exception ( bracketOnError ) #endif 所以我做了: #if __GLASGOW_HASKELL__ >= 761 import Text.Read ( rea
#if…
导入所述函数,否则,我将以不同的方式处理错误
我看到了一些:
#if __GLASGOW_HASKELL__ >= 610
import Control.Exception ( bracketOnError )
#endif
所以我做了:
#if __GLASGOW_HASKELL__ >= 761
import Text.Read ( readMaybe )
#endif
考虑到761
是GHC版本7.6.1
的别名,当我构建cabal软件包并试用它时,该函数没有被导入,即使我使用了光荣的格拉斯哥哈斯克尔编译系统版本7.8.4
因此,在使用一个程序进行尝试之后,我发现7.8.1
在\uuu格拉斯哥\uu哈斯克尔\uuu
中标识为708
{-# LANGUAGE CPP #-}
module Main where
#if __GLASGOW_HASKELL__ == 708
ver = "==708"
#else
ver = "/=708"
#endif
main = putStrLn $ ver
并运行它:
$ runhaskell if.hs
==708
我如何知道应该为7.6.1
使用什么值,或者是否有更好的方法来处理此问题?阅读:
对于GHC的x.y.z版本,\uu格拉斯哥•哈斯凯尔•ucode>的值是整数xyy(如果y是一个位数,则会添加前导零,因此,例如在GHC的6.2版本中,\uu格拉斯哥•哈斯凯尔•ucode>==602)。更多信息请参见第1.4节“GHC版本编号政策”
如果运气好的话,\uuuuuuu GLASGOW\uuhaskell\uuuuu
将在所有其他支持C风格预处理的实现中被取消定义
(参考:其他系统的可比符号为:\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
注意。在预处理Haskell源和C源时设置此宏,包括从Haskell模块生成的C源(即.hs、.lhs、.C和.hc文件)
如GHC《用户指南》第1部分所述:
对于GHC的版本x.y.z
,\uuuuu GLASGOW\uu HASKELL\uuuu
的值为整数⟨xyy⟩ (如果⟨Y⟩ 是一个位数,然后添加前导零,例如在GHC的6.2版中,\uuuuuuu GLASGOW\uuu HASKELL\uuuu==602
)。更多信息请参阅
因此,对于7.6.1
,您可以检查\uu格拉斯哥\uu哈斯克尔\uu>=706
。原因是类似于7.10.x
的版本,正如Daniel Wagner指出的,检查软件包版本的最正确方法通常是使用CabalMIN_版本
宏。例如,您可以使用
#if MIN_VERSION_base(4,6,0)
确定base
软件包是否至少为4.6.0版,这是您寻求的功能的最早版本
base
包有点奇怪。GHC和现已不复存在的Hugs和NHC实现都使用了它。使用Cabal宏是检查base
版本的一种更方便的方法。如今,GHC是唯一一个使用base
,因此可移植性的论据就不那么清晰了,但这种方法还有检查主要版本号和次要版本号的优势
由于base
版本与GHC版本的关系非常紧密,因此您可以定义MIN\u VERSION\u base
的合理回退形式,以便在没有阴谋集团的情况下进行编译,使用\u格拉斯哥\u HASKELL\u
来估计base
版本。当前的容器
头部有条件地定义了这样一个后退
更新
从GHC 8开始,编译器本身已经接管了定义MIN_VERSION
宏的工作。这很好,因为无论您是否使用阴谋集团构建,您现在都可以使用这些宏。再也没有丑陋的近似了 我应该检查版本706
还是707
。因为7.6.0
没有这个功能。@chamini2这似乎不太可能。较小的版本更改(第三个数字)应该只修复bug,否则不应该更改功能(cf)。这个函数是什么?好的,我明白了readMaybe
fromText.读取
,在项目符号1.5.3.2基础中。所以706
应该可以吗?@chamini2如果你想依赖一个版本的base,你应该这样做,而不是依赖一个版本的GHC。使用cabal的MIN_版本宏系列(再次阅读详细文档,了解它们的工作原理)。