是否可以检查函数是否已定义,如果是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
已在该范围内定义。