生成访问器的Julia宏。

3

我需要一个宏来在Julia编程语言中生成访问器函数。使用如下结构体:

struct Account
  account_number::String
  balance::Float64
end

我希望它可以生成以下代码:

  account_number(acc::Account) = acc.account_number
  balance(acc::Account) = acc.balance

我希望能这样使用它:

@generate_accessors Account

我在互联网上搜索并找到了Accessors.jl软件包,但它似乎与我的问题无关。由于Julia社区相当活跃,所以我希望这样的宏在某个地方存在。不幸的是,我没有足够的Julia经验来实现这样的宏,我甚至不知道是否可以制作这样的宏。感谢任何对正确方向推动的帮助。


一个账户的 account_number 不是有点冗余吗?它不应该只是 number,就像 number(account) 一样吗? - DNF
1个回答

2

我不知道是否有这样一个宏的库,但创建一个基本的宏并不太难:

# accessor(:foo, FooBar) ->  quote foo(x::FooBar) = x.foo end
accessor(field, type) = :($(esc(field))(x::$type) = x.$field)

macro generate_accessors(type)
  definitions = (accessor(s, type) for s in fieldnames(eval(type)))
  Expr(:block, definitions...)
end

julia> struct FooBar
           foo
           bar
       end

julia> @generate_accessors FooBar
bar (generic function with 1 method)

julia> foo(FooBar(1,2))
1

julia> bar(FooBar(1,2))
2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接