• 方法调用语法限制

    方法调用语法限制

    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 将其转换为序列之前不可调用。