Tôi đang cố gắng sử dụng macro @evalpoly
của Julia. Nó hoạt động khi tôi cung cấp các hệ số theo cách thủ công, nhưng tôi không thể tìm ra cách cung cấp các hệ số này thông qua một mảngMacro Julia @evalpoly với varargs
julia> VERSION
v"0.3.5"
julia> @evalpoly 0.5 1 2 3 4
3.25
julia> c = [1, 2, 3, 4]
4-element Array{Int64,1}:
1
2
3
4
julia> @evalpoly 0.5 c
ERROR: BoundsError()
julia> @evalpoly 0.5 c...
ERROR: BoundsError()
julia> @evalpoly(0.5, c...)
ERROR: BoundsError()
Ai đó có thể chỉ cho tôi đúng hướng?
gia tăng sau khi nhìn thấy câu trả lời tuyệt vời cho câu hỏi này
Có một sự tinh tế đến rằng tôi đã không nhìn thấy cho đến khi tôi chơi với một số trong những câu trả lời. Các z
lập luận để @evalpoly
có thể là một biến, nhưng các hệ số được dự kiến sẽ là các chữ
julia> z = 0.5
0.5
julia> @evalpoly z 1 2 3 4
3.25
julia> @evalpoly z c[1] c[2] c[3] c[4]
ERROR: c not defined
Nhìn vào kết quả của việc mở rộng lệnh cuối cùng này, người ta có thể thấy rằng nó thực sự là trường hợp đó z được gán đến một biến trong phần mở rộng nhưng các hệ số được chèn vào đúng theo mã.
julia> macroexpand(:@evalpoly z c[1] c[2] c[3] c[4])
:(if Base.Math.isa(z,Base.Math.Complex)
#291#t = z
#292#x = Base.Math.real(#291#t)
#293#y = Base.Math.imag(#291#t)
#294#r = Base.Math.+(#292#x,#292#x)
#295#s = Base.Math.+(Base.Math.*(#292#x,#292#x),Base.Math.*(#293#y,#293#y))
#296#a2 = c[4]
#297#a1 = Base.Math.+(c[3],Base.Math.*(#294#r,#296#a2))
#298#a0 = Base.Math.+(Base.Math.-(c[2],Base.Math.*(#295#s,#296#a2)),Base.Math.*(#294#r,#297#a1))
Base.Math.+(Base.Math.*(#298#a0,#291#t),Base.Math.-(c[1],Base.Math.*(#295#s,#297#a1)))
else
#299#t = z
Base.Math.+(Base.Math.c[1],Base.Math.*(#299#t,Base.Math.+(Base.Math.c[2],Base.Math.*(#299#t,Base.Math.+(Base.Math.c[3],Base.Math.*(#299#t,Base.Math.c[4]))))))
end)
[PR # 7186] (https://github.com/JuliaLang/julia/pull/7186) sẽ cho phép điều này thông qua một phiên bản chức năng. Có vẻ như nó có thể sử dụng một số hỗ trợ - thêm một bình luận thể hiện mong muốn của bạn để xem nó trong cơ sở! –
Ian, cảm ơn vì sự thấu hiểu của bạn. Tôi chắc chắn đánh giá cao nó vì nó giúp tôi grok Julia macro nói chung, không chỉ vấn đề cụ thể này. Tôi sẽ cố gắng theo dõi đề xuất của bạn để thêm sự cố trong vài ngày tới. –
Tôi đã cập nhật cho bản cập nhật của bạn, hãy cho tôi biết nếu nó rõ ràng. – IainDunning