Julia 朱莉娅·麦克罗不';无法识别数组参数

Julia 朱莉娅·麦克罗不';无法识别数组参数,julia,Julia,我编写了一个相当复杂的宏来处理数组,但它不起作用。即使将宏替换为非常简单的宏,我也会收到相同的错误消息: macro len(arr::Array) length(arr) end @len [1 2 3] 我收到的错误消息是: ERROR: LoadError: MethodError: no method matching @len(::Expr) 为什么朱莉娅坚持把我的输入解释为一个表达式?我对Julia是个新手,很明显我对宏和类型系统都不了解。有人能解释一下吗 编辑:是时候

我编写了一个相当复杂的宏来处理数组,但它不起作用。即使将宏替换为非常简单的宏,我也会收到相同的错误消息:

macro len(arr::Array)
    length(arr)
end

@len [1 2 3]
我收到的错误消息是:

ERROR: LoadError: MethodError: no method matching @len(::Expr)
为什么朱莉娅坚持把我的输入解释为一个表达式?我对Julia是个新手,很明显我对宏和类型系统都不了解。有人能解释一下吗

编辑:是时候解释一下我原来的宏的用途了。我想将一个表作为输入,并使用它定义局部范围内的变量。第一列中的条目定义单个变量名称,其他列定义变量内容。因为函数不能这样做,所以我需要一个宏。我有一个工作宏,它接受一个长(三重引号)字符串作为输入,但现在我希望它接受一个数组作为输入

在这个解释之后,也许我应该添加另一个子问题:为什么我的另一个宏接受适当的输入(它被定义为
宏foo(text::String)
),而数组版本不接受?

用户在与我讨论时在irc上回答了这个问题:

@len$a
宏位于表达式上,而不是值上,因此 这听起来像是你想要的函数 (如果真的需要的话)

我不确定这在那里是否管用。 这不是宏的用途。。 它主要用于将表达式转换为其他表达式

如果试图对值使用宏,则需要函数 (您可以在这里使用
@eval
或其他方法来实现此功能,但要使宏像函数一样工作,您需要花费大量时间)

…作为一项功能:

julia> function len(x)
       length(x)
       end
len (generic function with 1 method)

julia> len(a)
3

julia> a
1x3 Array{Int64,2}:
 1  2  3

回答我自己的问题:这就是“可笑的简单”宏应该如何编写的

macro len(expr)
    :(length($expr))
end
这是在一个表达式上操作的,而不是数组(感谢您指出这一点)。我被自己的实验误导了,因为一个类似的字符串宏恰好起作用:

# MISLEADING CODE, DON'T USE THIS!
macro lenstr(str::String)
    length(str)
end
显然Julia允许使用字符串宏,但这是宏对表达式进行操作的一般规则的一个例外。要说明参数在宏中的显示方式,请执行以下操作:

macro dump(arg)
   dump(arg)
end

julia> @dump "foo bar"
String "foo bar"

julia> @dump [1,2,3]
Expr
  head: Symbol vect
  args: Array{Any}((3,))
    1: Int64 1
    2: Int64 2
    3: Int64 3
  typ: Any

julia> @dump [1 2 3]
Expr
  head: Symbol hcat
  args: Array{Any}((3,))
    1: Int64 1
    2: Int64 2
    3: Int64 3
  typ: Any

注意宏如何将
[1,2,3]
[1,2,3]
视为表达式,而不是数组。这就是我错误的根源。通过应用在这里学到的经验,我的更复杂的宏现在可以从数组中创建局部范围内的变量。谢谢大家!

嗯,这里的措词风格看起来非常熟悉。谢谢你的建议,但我真的需要一个宏,它需要对值进行操作。我在我的问题中添加了一个解释原因的编辑。请给出一个你想做什么的最小示例,即输入是什么以及期望的输出/效果是什么。否则就无法提供帮助。宏只能接收和返回表达式。请阅读手册的一节。具体来说,请看“宏参数可能包括表达式、文字值和符号”一节。这意味着,我认为,您可以输入文字数组,例如
[1,2,3]
,但不能输入包含数组的变量。此外,创建这样的变量听起来通常是个坏主意。
[1,2,3]
也被解释为一个表达式,请参见下面我的答案。