1

是否可以检查一个函数是否已定义,如果是,则将其用作类型的JustMaybeNothing当然,如果未定义,请使用。

我正在编写一个原子包装器,用于 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 () |]

这不打印任何内容。如果我定义ain Library.hs,它将打印一次,因为a在该范围内定义。

4

0 回答 0