【问题标题】:error: "struct" expression not at top level错误:“结构”表达式不在顶层
【发布时间】:2021-12-05 21:20:29
【问题描述】:
function check(str,arg;type=DataType,max=nothing,min=nothing,description="")
    @argcheck typeof(arg)==type
    @argcheck arg>min
    @argcheck arg<max
    @argcheck typeof(description)==String
   return arg
end


 function constr(name,arg,field)
        return :(function $name($arg,$field)
            new(check($name,$arg,$field))
        end)
    end
    
macro creatStruct(name,arg)
   code = Base.remove_linenums!(quote
     struct $name
        end
     end)
     print(arg)
   append!(code.args[1].args[3].args,[constr(name,arg.args[1].args[1],arg.args[1].args[2])])
   code 
end 

macro myStruct(name,arg)
    @creatStruct name arg
  end 





@myStruct test12 (
  (arg1,(max=10))
)

在我上面的代码中,我试图构建一个macro,它创建一个struct,并且在结构中,您可以定义一个带有边界(最大值、最小值)和描述等的参数。 我收到此错误: 语法:"#141#max = 10" is not a valid function argument name

每次我尝试解决它时,都会收到另一个错误,例如: LoadError: syntax: "struct" expression not at top level

所以,我认为我的代码/方法没有那么连贯。任何人都可以提出建议和/或其他方法。

【问题讨论】:

    标签: macros julia syntax-error metaprogramming


    【解决方案1】:
    1. 您正在尝试使用默认值为10 的参数名称max。错误是关于 max=10 不是有效名称 (Symbol),而 max 是。更大的问题是你试图把它放在struct 表达式而不是构造函数方法中:
    struct Foo
      bar::Float64
      max::Int64
    end
    
    # constructor
    Foo(bar, max=10) = Foo(bar, max)
    

    因此,您也必须弄清楚如何为具有默认值的方法创建表达式。

    1. 您的第二个错误意味着structs 必须在顶层定义。 “顶级”类似于全局范围,但在某些情况下更严格;我不知道确切的区别,但它绝对不包括本地范围(macrofunction 等)。看起来问题是creatStruct 返回的表达式被评估为myStruct 中的代码,但我得到的LoadError 有不同的消息。无论如何,如果我确保事情保持为表达式,错误就会消失:
    macro myStruct(name,arg)
        :(@creatStruct $name $arg)
    end 
    

    【讨论】:

      猜你喜欢
      • 2011-10-16
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      • 2017-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多