这可能看起来很奇怪,也许是不可能的,但我想知道是否有办法创建一个宏来评估传递的表达式并执行import
。
如果字符串文字是表达式,我可以很容易地使它工作:
import macros
macro createImport(ex: expr): stmt =
result = newNimNode(nnkImportStmt)
result.add(ex)
createImport("strutils")
let a = ["foo", "bar", "baz"]
echo a.join("---") # using `join()` from the `strutils` module
但如果传递了一个变量,这当然会失败。
var s = "strutils"
createImport(s)
(请注意,导入可以是执行模块的字符串路径。)
我尝试过对宏的许多调整,并搜索了文档和来源,但我找不到一种方法来使ex: expr
的实际值在import
中有用。
我可以让宏创建一个echo
调用来显示传递的字符串,但任何尝试将其与导入一起使用最终都会使用变量名本身。
我想这是因为它似乎在评估宏本身时可能无法使用该值。是否可以这样做,如果是这样,怎么做?
答案 0 :(得分:2)
我不太清楚为什么你需要这样一个帮助宏以及它是否是一个好主意,但实现你需要的最简单方法如下:
template my_import(x: static[string]) = import x
const x = "strutils"
my_import x