Haskell 中的条件编译

栏目: IT技术 · 发布时间: 5年前

背景

最近在用 Haskell 语言和 haskell-gi 包写一款 Haskell IDE ,这款软件初步支持简体中文和英文两种语言环境(中文简体语言环境展示中文简体,其他环境展示英文)。实现这种国际化的需求,有多种方法,比如,在 C/C++ 下可以使用 GNU gettext ,在Haskell下也有其移植。我采用了另一种方法:通过判断当前语言环境,决定要使用的语言版本,所以实现都是可以通过纯 Haskell 代码实现,多了一层类型安全的保证。

由于目前在Haskell中还没有好用的方法获取语言环境(glib中提供了 g_get_language_names 函数实际上可以达到目的,但比较难用),所以需要调用平台相关的函数,在 Windows 下使用 GetSystemDefaultLangID 。这需要根据不同的操作系统执行的不一样的代码,即根据不同的平台编译不同部分的代码,即 条件编译

Haskell中的条件编译支持

比较令人失望的是,在条件编译这块, Haskell 并没有自己出彩的地方,继续沿用了 C/C++ 那一套,即使用预处理指令判断预定义的宏达到编译不同部分代码的目的。在语法上,Haskell的预编译指令跟C/C++的完全一样,所以有了 C/C++ 的经验可以无缝迁移到 Haskell 上面。

下面是一些使用上的细节点:

Q1:怎么启用 Haskell 程序的预处理过程

我们知道,正常的 Haskell 程序处理过程是没有预处理的,我们需要一种方式明确告知构造过程要调用预处理器。这是通过 CPP 语言扩展实现的,这需要我们在源文件的顶层添加:

{-# LANGUAGE CPP #-}

Q2:Haskell提供了哪些标准宏

GHC (8.2.2)用户手册 7.11.3.1. Standard CPP macros 列了一些可用的宏可以用于代码,包括GHC软件版本、操作系统、硬件架构、软件包等方面的宏,下面仅摘录两个:

os_HOST_OS=1

This define allows conditional compilation based on the Operating System, where⟨os⟩ is the name of the current Operating System (eg. linux , mingw32 for Windows, solaris , etc.).

arch_HOST_ARCH=1

This define allows conditional compilation based on the host architecture, where⟨arch⟩ is the name of the current architecture (eg. i386 , x86_64 , powerpc , sparc , etc.).

除了这些预定义宏,你也可以在代码里像使用 C/C++ 一样,定义自己的宏。

Q3:怎将通过命令参数定义宏

一般的 C/C++ 编译器都允许通过编译器选项定义宏,而 GHC 也提供了类似的选项:

Haskell 中的条件编译

最常用的是 -D 选项,这跟gcc编译器的用法完全一致,可以在编译时通过定义不同的宏控制编译过程。

示例

最后一个简单例子演示怎么使用条件编译。

{-# LANGUAGE CPP #-}


main :: IO ()

main =

#if defined linux_HOST_OS

putStrLn "Linux"

#elif defined mingw32_HOST_OS

putStrLn "Windows"

#else

putStrLn "Other"

#endif

有一点需要注意的是, Windows 下的宏定义 mingw32_HOST_OS 代表全部 Windows 系统,不要被其中的 32 迷惑,以为仅代表是 32 Windows 系统。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Test Driven Development

Test Driven Development

Kent Beck / Addison-Wesley Professional / 2002-11-18 / USD 49.99

Quite simply, test-driven development is meant to eliminate fear in application development. While some fear is healthy (often viewed as a conscience that tells programmers to "be careful!"), the auth......一起来看看 《Test Driven Development》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具