方法调用语法限制

x.f 中的表达式 x 需要进行语义检查(即符号查找和类型检查),然后才能确定需要将其重写为 f(x) 。 因此,当用于调用模板/宏时,点语法有一些限制:

  1. template declareVar(name: untyped) =
  2. const name {.inject.} = 45
  3.  
  4. # 不能编译:
  5. unknownIdentifier.declareVar

另一个常见的例子是:

  1. from sequtils import toSeq
  2.  
  3. iterator something: string =
  4. yield "Hello"
  5. yield "World"
  6.  
  7. var info = something().toSeq

这里的问题是编译器已经决定 something() 作为迭代器在 toSeq 将其转换为序列之前不可调用。