这可能看起来很奇怪,而且可能是不可能的,但我想知道是否有一种方法可以创建一个宏来评估传递的表达式并执行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
调用,该调用显示传递的字符串,但任何将它与导入一起使用的尝试最终都会使用变量名本身。
我想这是因为在评估宏本身时该值似乎不可用。是否有可能做到这一点,如果可以,怎么做?