是否可以检查一个函数是否已定义,如果是,则将其用作类型的Just
值Maybe
?Nothing
当然,如果未定义,请使用。
我正在编写一个原子包装器,用于 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,那么我的代码应该将该 atom 编译为一个名称相同的 C 函数,并为其提供适当#pragma
的内容以服务于 timer 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
in Library.hs
,它将打印一次,因为a
在该范围内定义。