macros - 错误:“结构”表达式不在顶层
问题描述
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
Creates a struct
,并且在结构中,您可以定义一个带有边界(最大值,最小值)和描述等的参数。我收到此错误:语法:"#141#max = 10" is not a valid function argument name
每次我试图解决它时,我都会收到另一个错误,例如:
LoadError: syntax: "struct" expression not at top level
所以,我认为我的代码/方法不是那么有凝聚力。任何人都可以提出建议和/或其他 Approche。
解决方案
- 您正在尝试
max
使用默认值为10
. 错误是关于max=10
不是一个有效的名称(Symbol
),max
而是。更大的问题是你试图把它放在struct
表达式中而不是构造函数方法中:
struct Foo
bar::Float64
max::Int64
end
# constructor
Foo(bar, max=10) = Foo(bar, max)
因此,您还必须弄清楚如何为具有默认值的方法创建表达式。
- 您的第二个错误意味着
struct
s 必须在顶层定义。“顶级”类似于全局范围,但在某些情况下更严格;我不知道确切的区别,但它绝对不包括本地范围(macro
,function
等)。看起来问题是通过creatStruct
在中作为代码评估返回的表达式myStruct
,但LoadError
我得到的消息不同。无论如何,如果我确保事情保持为表达式,错误就会消失:
macro myStruct(name,arg)
:(@creatStruct $name $arg)
end
推荐阅读
- openvpn - 在维护时将 VPN 用户路由到另一台服务器
- scala - 如果存在其他外部键,如何获取带有映射键的新列表?
- java - 在 internalStorage 中保存 mp3 文件的问题
- wordpress - 如何将序列化数据保存到 MySQL 的元字段中?
- jquery - 如何使用 jQuery 用表单的文本字段填充表格?
- javascript - Android App软键盘覆盖webview嵌入的网页textarea
- javascript - 显示限制列表并显示更多按钮
- firebase - 响应中带有 google 'Access-Control-Allow-Credentials' 标头的 Flutter Web firebase_auth 登录为 ''(空)
- database - Mongo DB $look up 方法用于数组而不是集合中的字段
- angular - MapBox Leaflet 路由机器无法识别