宏来评估表达式并创建导入

时间:2015-03-18 20:45:42

标签: import macros nim

这可能看起来很奇怪,也许是不可能的,但我想知道是否有办法创建一个宏来评估传递的表达式并执行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调用来显示传递的字符串,但任何尝试将其与导入一起使用最终都会使用变量名本身。

我想这是因为它似乎在评估宏本身时可能无法使用该值。是否可以这样做,如果是这样,怎么做?

1 个答案:

答案 0 :(得分:2)

我不太清楚为什么你需要这样一个帮助宏以及它是否是一个好主意,但实现你需要的最简单方法如下:

template my_import(x: static[string]) = import x

const x = "strutils"
my_import x