2015-05-24 28 views
6

Trong Julia, có cách nào để viết macro mà các nhánh dựa trên kiểu đối số (biên dịch) của nó, ít nhất là đối với các đối số có thể suy ra tại thời gian biên dịch? Giống như trong ví dụ bên dưới, tôi đã tạo một hàm có tên là code_type trả về loại biên dịch là x. Có chức năng nào giống như vậy, hay cách nào để tạo ra loại hành vi này? (Hay macro được mở rộng trước khi loại được suy ra, như vậy mà loại điều là không thể.)Trong Julia, macro có thể truy cập loại suy luận của các đối số của nó không?

macro report_int(x) 
    code_type(x) == Int64 ? "it's an int" : "not an int" 
end 

Trả lời

8

Macros không thể làm được điều này, nhưng tạo ra các chức năng có thể.

Kiểm tra các tài liệu ở đây: http://julia.readthedocs.org/en/latest/manual/metaprogramming/#generated-functions

+2

Chỉ cần một lưu ý nhỏ về pedantic: các hàm được tạo ra hoạt động trên các kiểu đối số thực tế của nó và không chỉ là các kiểu suy luận. (Cả hai đều giống nhau nếu hàm này ổn định). –

+0

Điểm tốt. Tôi cũng nên đề cập đến điều này chỉ có sẵn trên các bản xây dựng 0.4dev gần đây. – spencerlyon2

4

Ngoài câu trả lời spencerlyon2 của, một lựa chọn khác là chỉ cần tạo ra các chi nhánh rõ ràng:

macro report_int(x) 
    :(isa(x,Int64) ? "it's an int" : "not an int") 
end 

Nếu @report_int(x) được sử dụng bên trong một hàm, và các loại x có thể suy ra, sau đó JIT sẽ có thể tối ưu hóa nhánh chết (cách tiếp cận này được sử dụng bởi @evalpoly macro trong thư viện chuẩn).

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