2014-09-27 13 views
6

tôi muốn trả lời this question sử dụng lập trình meta, nhưng các quy tắc Phạm vi của vòng lặp for đang gây ra các biến của tôi không được định nghĩa ở phía trên nhất (REPL) Phạm vi:Khai báo các biến cấp cao nhất trong Julia sử dụng lập trình meta

for x = [:A1, :A2] 
    @eval x = rand(2,2) 
end 

Tôi biết có lẽ là một cách dễ dàng xung quanh điều này, nhưng bộ não đêm thứ sáu của tôi không thể nghĩ ra. Có thể một trong số các bạn lập trình meta metaprogramming giúp tôi tìm ra giải pháp ngắn gọn không? (Tôi nhận ra một macro có thể làm việc với thoát, nhưng tôi đang cố gắng để nghĩ ra một cái gì đó ngắn hơn)

+0

Tôi đã thấy điều đó và tự hỏi làm thế nào bạn sẽ metaprogram nó nếu bạn đã có hàng trăm A. 'cho x = 1: 100' và sau đó là gì? Các tên biến có thể được lập trình như thế nào? – rickhg12hs

+1

Đã trả lời nhận xét/câu hỏi của riêng tôi. 'cho k = 1: 10 my_sym = symbol (" A "* string (k)); @eval $ my_sym = rand (2,2) end' (Hiển thị ở đây tạo A1 đến A10.) – rickhg12hs

Trả lời

7

Nếu bạn chỉ muốn xác định các biến trong phạm vi toàn cầu, bạn chỉ cần thiếu một $:

for x = [:A1, :A2] 
    @eval $x = rand(2,2) 
end 

Nhưng @eval luôn được đánh giá ở cấp cao nhất ngay cả khi bạn đặt nó bên trong một hàm. Nếu bạn muốn xác định các biến trong một phạm vi chức năng, bạn cần phải đặt toàn bộ chức năng bên trong @eval, xây dựng các khối mã, và suy nó vào chức năng:

@eval function f() 
    ... 
    $([:($x = rand(2, 2)) for x in [:A1, :A2]]...) 
    ... 
end 

Mã này cũng có thể được trivially chuyển thể thành một macro (nhưng sau đó nó cần esc).

+0

Ahh, cảm ơn. cho ví dụ thứ hai của bạn tôi đã thử một phiên bản cắt giảm nhưng có: julia> @eval $ ([: ($ x = rand (2,2)) cho x trong [: B1,: B2]] ...) L ERI: type: apply_type: trong Vararg, dự kiến ​​Kiểu {T <: Top}, có Array {Expr, 1} – JKnight

+0

Dường như bạn cần '@eval bắt đầu $ ([: ($ x = rand (2,2)) cho x trong [ : B1,: B2]] ...) end' hoặc 'eval (Expr (: block, [: ($ x = rand (2,2)) cho x trong [: B1,: B2]] ...)) 'để làm việc. Nhưng tôi không chắc là có nhiều điểm, vì điều đó sẽ vẫn xác định các biến ở phạm vi toàn cầu ngay cả khi bạn đặt nó vào bên trong một hàm, và nếu đó là những gì bạn nghĩ thì ví dụ đầu tiên của tôi trông đẹp hơn một chút. – simonster

Các vấn đề liên quan