编译时检查是否定义了名称

时间:2013-08-08 08:19:01

标签: haskell embedded

是否可以检查函数是否已定义,如果是Just类型,则将其用作Maybe值?如果没有定义,请使用Nothing

我正在编写一个atom封装器,用于TI MSP430线。我正在做的一部分是创建一个函数,可以快速编译MSP430控制器的正确格式的代码 - 例如,编译一个原子用于定时器中断需要一个像这样的函数定义:

#pragma vector=TIMERA0_VECTOR __interrupt
void timerAisr(void) {
    ...
}

目前,我有一个对象,其中包含用户希望用于每个不同ISR的函数的引用。看起来有点像这样:

mspProgram = MSP430Compilation {
    setupFn = Nothing,
    setupFnName = "setup",
    loopFn = Nothing,
    loopFnName = "loop",
    timerAISR = Nothing,
    timerAISRName = "timerAISR",

等等。非常可配置 - 您可以选择要在C代码中输出的函数的名称,以及为该函数编译的Atom。但是我已经决定采用更多的约定配置方法,并且基本上假设一些合理的函数名称。因此,我不想传递其中一个配置对象,而是希望编译代码检查明确命名函数的定义。

例如,如果用户定义了一个名为timerAISR的Atom,那么我的代码应该将该原子编译为一个名为相同的C函数,并使用适当的#pragma来处理定时器A中断。

所以我需要做的是一些meta-Haskell,检查用户是否定义了一个函数并在我的库代码中使用它。我想这可能涉及模板Haskell,所以我要研究它。

编辑:

我已经意识到,一旦我尝试将其融入我的实际代码中,我的原始解决方案就太简单了。我没有吸收Haskell的命名空间,所以我没有意识到lookupValueName不会对用户代码中定义的值起作用。以下是我正在处理的情况:

main.hs

module Main where
import Library

a = 1

main = libraryMain

Library.hs

{-# LANGUAGE TemplateHaskell #-}

module Library where
import Template

libraryMain :: IO ()
libraryMain = do
    $(printSomethingIfIsDefined "a")
    $(printSomethingIfIsDefined "b")

Template.hs

{-# LANGUAGE TemplateHaskell #-}

module Template where
import Language.Haskell.TH

printSomethingIfIsDefined name = do
maybeFn <- lookupValueName name
case maybeFn of
    Just fn -> [| putStrLn "It's defined!" |]
    Nothing -> [| return () |]

这不会打印任何内容。如果我在a中定义Library.hs,则会打印一次,因为a已在该范围内定义。

0 个答案:

没有答案