2

这可能看起来很奇怪,而且可能是不可能的,但我想知道是否有一种方法可以创建一个宏来评估传递的表达式并执行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: exprimport.

我可以让宏创建一个echo调用,该调用显示传递的字符串,但任何将它与导入一起使用的尝试最终都会使用变量名本身。

我想这是因为在评估宏本身时该值似乎不可用。是否有可能做到这一点,如果可以,怎么做?

4

1 回答 1

2

我不太确定为什么需要这样的辅助宏以及它是否是一个好主意,但实现所需功能的最简单方法如下:

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

const x = "strutils"
my_import x
于 2015-03-19T17:54:12.467 回答