修改Emacs Inferior Haskell进程以启用CPP处理

时间:2014-05-31 14:52:47

标签: haskell emacs ghci

如果我们查看The random package的来源,我们就会有一个文件Random.hs。由于CPP扩展,必须通过以下命令调用ghci:

ghci -cpp Random.hs

或者可以做:

ghci -cpp

然后从ghci:

Prelude GOA> :load Random
[1 of 1] Compiling System.Random    ( Random.hs, interpreted )
Ok, modules loaded: System.Random.

如果我使用Emacs Inferior Haskell模式(Emacs/Inferior Haskell processes)而且我有 来源:

module Main where
import System.Random

gen = (random (mkStdGen 0)) :: (Bool,StdGen)

mymult :: Int -> Int
mymult x = 2 * x

main = do
  print $ mymult 5

然后输入emacs命令:

C-c C-l

inferior-haskell-load-file,ghci在emacs的子窗口中打开。但是,如果在此窗口中输入load Random.hs,则会收到错误消息:

*Main GOA> :load Random.hs

Random.hs:1:2: lexical error at character 'i'
Failed, modules loaded: none.

如何考虑cpp扩展程序加载Random.hs?或者,如何修改haskell-mode/inf-haskell.el,以便在键入-cpp时使用C-c C-l选项调用ghci,以便可以无误地执行命令:load Random.hs

1 个答案:

答案 0 :(得分:5)

最可靠的方法当然是在文件标题中请求CPP以及其他扩展名:

{-# LANGUAGE CPP         #-}

#if __GLASGOW_HASKELL__ >= 701
{-# LANGUAGE Trustworthy #-}
#endif

-----------------------------------------------------------------------------
-- |
-- Module      :  System.Random
-- Copyright   :  (c) The University of Glasgow 2001
-- License     :  BSD-style (see the file LICENSE in the 'random' repository)

random包仅在.cabal文件中执行此操作。

最简单的方法可能只是在所有ghci会话中永久启用CCP,方法是添加

:set -XCPP

到您的~/.ghci文件。