假设我想实现一个提供自定义向量类的模块,并为它重载所有基本的一元操作(round,ceil,floor,...)。在朱莉娅,这应该是相当简单的:
module MyVectors
export MyVector
immutable MyVector{T} data::Vector{T} end
# This is the tricky part
for f in (:round, :ceil, :floor)
@eval Base.$f(x::MyVector) = MyVector($f(x.data))
end
end
不幸的是,这不起作用。我收到以下错误:
ERROR: error compiling anonymous: syntax: prefix $ in non-quoted expression
in include at ./boot.jl:245
in include_from_node1 at ./loading.jl:128
while loading /home/masdoc/Desktop/Julia Stuff/MyVectors.jl, in expression starting on line 6
问题似乎是Base.$f
部分,因为如果我删除Base.
,那么它就会编译。我想重载Base.round
而不是创建新的round
方法,因此这不是一个有效的解决方案。
答案 0 :(得分:1)
Requests.jl可能是您尝试做的一个很好的例子,循环符号以生成函数。以下是使循环工作的方法:
module MyVectors
export MyVector
immutable MyVector{T} data::Vector{T} end
# This is the tricky part
for f in (:round, :ceil, :floor)
@eval (Base.$f)(x::MyVector) = MyVector(($f)(x.data))
end
end
using MyVectors
v = MyVector([3.4, 5.6, 6.7])
println(round(v))
println(ceil(v))
println(floor(v))
您可能还会发现有关元编程的this视频和julia中的宏很有用。