gpt4 book ai didi

include - 如何从 Nim 中的导入失败中恢复?

转载 作者:行者123 更新时间:2023-12-02 12:31:23 25 4
gpt4 key购买 nike

Nim我可以编写以下代码来导入外部模块:

import myFancyPantsModule
...
# And here I'd use the fancyPants proc

只要我有该模块,这就可以正常工作,但对于可能下载代码但未安装模块的人来说,编译将会失败,并显示一条不太用户友好的消息:

$ nim c fancyProgram.nim
fancyProgram.nim(1, 7) Error: cannot open 'myFancyPantsModule'

有什么办法可以绕过 import这样我就可以像异常一样捕获它并执行类似于 when 的替代代码分支陈述?我希望能找到一些importable -类似宏或我可以使用的东西,例如:

when importable(myFancyPantsModule):
# And here I'd use the fancyPants proc
else:
quit("Oh, sorry, go to https://github.com/nim-lang/nimble and install " &
" the myFancyPantsModule using the nimble package manager")

事实上,我想让一些模块可选,而不是简单的错误消息,以便编译仍然继续进行,可能会减少功能。这可能吗?

解决方案编辑:根据这里的答案是我的版本如何解决问题,首先您需要一个 moduleChecker具有以下来源的二进制文件:

import os, osproc

let tmpFile = getTempDir() / "dynamicModuleChecker.nim"

proc checkModule(module: string) =
except:
echo "Cannot write ", tmpFile, " to check the availability of modules"
quit(1)
writeFile(tmpFile, "import " & module & "\n")

finally: removeFile(tmpFile)

except:
echo("Cannot run \"nimrod check\" to check the availability of modules")
quit(1)
if execCmdEx("nim check " & tmpFile).exitCode != 0:
echo("Cannot import module " & module & ".")
quit(1)
else:
echo "OK"

if ParamCount() < 1:
quit("Pass as first parameter the module to check")
else:
checkModule(ParamStr(1))

然后,让此命令可用,可以使用以下宏:

import macros

macro safeImport(module, message: string): stmt =
if "OK" == gorge("./moduleChecker " & module.strVal):
result = newNimNode(nnkStmtList).add(
newNimNode(nnkImportStmt).add(
newIdentNode(module.strVal)))
else:
error("\nModule " & module.strVal &
" not available.\n" & message.strVal)

safeImport("genieos",
"Please install \"http://gradha.github.io/genieos/\"")

不幸的是,必须生成一个单独的进程,不仅用于外部编译,还需要另一个进程来生成要检查的临时文件,因为没有 staticWrite在当前版本中在编译时生成文件。

最佳答案

据我所知,没有(简单)的方法可以做到这一点。您可以做的是在构建中使用单独的配置/检查阶段。例如:

import macros, os, osproc

proc checkModule(module, howtomessage: string) =
except:
echo("Cannot write .conftest.nim to check the availability of modules")
quit(1)
writeFile(".conftest.nim", "import " & module & "\n")

except: nil
removeFile(".conftest.nim")

except:
echo("Cannot run \"nimrod check\" to check the availability of modules")
quit(1)
if execCmdEx("nimrod check .conftest.nim").exitCode != 0:
echo("Cannot import module " & module & ".")
echo(howtomessage)
quit(1)

checkModule "foobar", "Please install it using the Babel package manager"

然后运行如下命令:

nimrod cc --run configure.nim && nimrod cc main.nim

假设上面的代码存储在名为 configure.nim 的文件中并且 nimrod 可执行文件位于您的路径中(否则,您还必须在 configure.nim 中指定 nimrod 路径)。

关于include - 如何从 Nim 中的导入失败中恢复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19954952/

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