Import 宏来计算表达式并创建导入

Import 宏来计算表达式并创建导入,import,macros,nim-lang,Import,Macros,Nim Lang,这可能看起来很奇怪,而且可能不可能,但我想知道是否有一种方法可以创建一个宏来计算传递的表达式并执行导入 如果字符串文字是表达式,我可以很容易地让它工作: import macros macro createImport(ex: expr): stmt = result = newNimNode(nnkImportStmt) result.add(ex) createImport("strutils") let a = ["foo", "bar", "baz"] echo a.join

这可能看起来很奇怪,而且可能不可能,但我想知道是否有一种方法可以创建一个宏来计算传递的表达式并执行
导入

如果字符串文字是表达式,我可以很容易地让它工作:

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
的实际值,以便在
导入中有用

我可以让宏创建一个
echo
调用,该调用显示传递的字符串,但是任何尝试在导入时使用它的行为都会使用变量名本身


我想这是因为在对宏本身求值时,该值可能不可用。有可能做到这一点吗?如果有,如何做到?

我不太清楚您为什么需要这样一个helper宏,这是否是一个好主意,但实现所需的最简单方法是:

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

const x = "strutils"
my_import x

helper宏是因为原始宏(据我所知)在展开之前无法使用
expr
的值。任何使用它的尝试最终都只会使用原始变量名。但这看起来很有趣。我要试试
静态[string]
。我不记得了。有两种方法可以称之为,所以我会四处看看,然后再回来。谢谢哦我知道这需要一个
常量
。我问题中的例子是对一个更大问题的简化,不可能使用
const
:-(不过还是要感谢这个想法。static[T]也可以与宏一起使用,以获得所需的效果,但它需要一些可以在编译时进行计算的东西(严格来说不是常量符号).Nim是一种编译语言,因此显然您无法在运行时提供导入的模块名称。导入基于构建应用程序时的某些文件系统分析,分析的根需要是调用宏的文件。但现在您已经让我考虑过了,它无法与宏一起工作,因为e、 当然,扩展的代码将在运行时被调用。编译时使用的API似乎有限制,所以我可能只需要使用
staticExec
来完成文件系统的工作(将您的帖子用作试探板。可以随意忽略或插话)…所以实际上,我所需要的就是导入。宏在编译时展开,导入也在编译时读取(非常确定),所以如果我能让它工作,它应该做我想做的事情。宏调用所在的文件本身实际上不需要使用任何东西。我知道在编译时获取应用程序根的唯一方法是从根文件调用
instantiationInfo()
,因此这是宏的关键部分。