gpt4 book ai didi

haskell - 在不编译源代码的情况下构建 Haddock 文档

转载 作者:行者123 更新时间:2023-12-03 17:09:12 25 4
gpt4 key购买 nike

我正在开发一个 Haskell 库,其中包含使用 Asterius 以 WebAssembly (WASM) 为目标的部分。 .这些部分不能用正常的ghc编译出于这个原因,我们有排除/包含 WASM 部分的标志。
尝试使用 Asterius 的 ahc-cabal new-haddock 构建文档失败。好像恢复正常了ghc对于黑线鳕命令。
我的问题是:我可以在不编译它描述的源代码的情况下构建 Haddock 文档吗?

我可能相关的文件摘录:
我的 cabal 文件的部分:

flag wasm
description: Eanbles builds targeting WASM.
default: False
manual: True

library
exposed-modules: Boardgame
build-depends: base >= 4.12 && < 5.0
if flag(wasm)
exposed-modules: Boardgame.Web
build-depends:
aeson >= 1.4 && < 1.6
, asterius-prelude == 0.0.1
, scientific >= 0.3 && < 0.4
CPP-options: "-DWASM"
Boardgame.hs部分:
#ifdef WASM
import Data.Aeson (ToJSON(toJSON), Value(Number, Null))
import Data.Scientific (fromFloatDigits)
#endif

-- | Represents one of the two players.
data Player = Player1 | Player2
deriving (Show, Eq)

#ifdef WASM
instance ToJSON Player where
toJSON = Number . fromFloatDigits . fromIntegral . playerToInt
#endif
Boardgame/Web.hs部分:
module Boardgame.Web (
addWebGame
) where

foreign import javascript "wrapper" jsMakeCallback :: IO () -> IO JSVal
foreign import javascript "boardgame.games[$1] = $2" jsSetGame :: JSVal -> JSVal -> IO ()

-- | Adds a named game to the list of games accessible from JavaScript.
addWebGame :: (ToJSON a, ToJSON c, FromJSON c, PositionalGame a c) => String -> a -> IO ()
addWebGame name startState = do
callback <- jsMakeCallback $ playWeb startState
jsSetGame (jsonToJSVal name) callback
我的主文件 ( Boardgame.hs) 包含代码“隐藏”在 WASM 标志后面,但没有任何代码有任何文档。 Boardgame/Web.hs仅在指定 WASM 标志并且具有文档的某些功能时才包含。
我想为 Boardgame.hs 中的所有记录函数构建文档和 Boardgame/Web.hs .

最佳答案

而不是排除您的模块Boardgame/Web.hs ,其中包含 GHC 无法处理的导入,完全在设置 WASM 标志时,您可以在 Boardgame/Web.hs 中使用 CPP有条件地将所有非 GHC 兼容的符号设置为 undefined .
我这样做的方法是将所有类型签名移动到模块的顶部,并进行两组定义,如下所示:

module Boardgame.Web (
addWebGame
) where

addWebGame :: (ToJSON a, ToJSON c, FromJSON c, PositionalGame a c) => String -> a -> IO ()
-- other signatures...

#ifdef WASM
foreign import javascript "wrapper" jsMakeCallback :: IO () -> IO JSVal
foreign import javascript "boardgame.games[$1] = $2" jsSetGame :: JSVal -> JSVal -> IO ()

addWebGame name startState = do
callback <- jsMakeCallback $ playWeb startState
jsSetGame (jsonToJSVal name) callback

-- other definitions...

#else

addWebGame = undefined

#endif
Boardgame.Web然后应该无条件导入。
这应该使用 GHC 构建。如果运行,它显然会出错而没有做任何有用的事情,但它足以让 cabal/haddock 提取文档。
不利的一面是改变了您构建代码的方式。
我确信这可以通过 awk 脚本之类的东西自动化,但它超出了我的范围。
或者,如果只是 FFI 声明是问题,您可以更简单(并且更自动化)执行此操作:
module Boardgame.Web (
addWebGame
) where

#ifdef WASM
foreign import javascript "wrapper" jsMakeCallback :: IO () -> IO JSVal
foreign import javascript "boardgame.games[$1] = $2" jsSetGame :: JSVal -> JSVal -> IO ()

#else
jsMakeCallback = undefined
jsSetGame = undefined
#endif

-- addWebGame and others unmodified.
为了让您开始自动化,使用类似 cat Boardgame/Web.hs | sed "s/foreign import javascript \"[^\"]*\" \([^ ]*\).*/\1 = undefined/" 的命令将提取 javascript 导入列表并将它们转换为未定义的分配。
快乐 haskell !

关于haskell - 在不编译源代码的情况下构建 Haddock 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67022097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com