用于评估表达式和创建导入的宏
Macro to evaluate expression and create import
这可能看起来很奇怪,也许是不可能的,但我想知道是否有一种方法可以创建一个宏来计算传递的表达式并执行 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
调用来显示传递的字符串,但任何将它与导入一起使用的尝试最终都会使用变量名称本身。
我猜是因为在计算宏本身时似乎该值可能不可用。是否可以这样做,如果可以,怎么做?
我不太确定您为什么需要这样的辅助宏以及它是否是个好主意,但实现您所需的最简单方法如下:
template my_import(x: static[string]) = import x
const x = "strutils"
my_import x
这可能看起来很奇怪,也许是不可能的,但我想知道是否有一种方法可以创建一个宏来计算传递的表达式并执行 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
调用来显示传递的字符串,但任何将它与导入一起使用的尝试最终都会使用变量名称本身。
我猜是因为在计算宏本身时似乎该值可能不可用。是否可以这样做,如果可以,怎么做?
我不太确定您为什么需要这样的辅助宏以及它是否是个好主意,但实现您所需的最简单方法如下:
template my_import(x: static[string]) = import x
const x = "strutils"
my_import x