Metaprogramming در جولیا (مفهومی)
آشنایی مفهومی با ماکروها، expression ها و quote — قدرت متا جولیا
Metaprogramming چیست؟
Metaprogramming یعنی کدی که کد مینویسد! جولیا (مثل Lisp) کد را بهعنوان داده میبیند که میتوان ساخت، تغییر داد و اجرا کرد.
Expression — کد بهعنوان داده
# کد داخل :() یک expression است
expr = :(1 + 2)
println(expr) # 1 + 2
println(typeof(expr)) # Expr
# دیدن ساختار درختی
println(expr.args) # [:+, 1, 2]
quote — expression های بزرگ
expr = quote
x = 10
y = 20
x + y
end
println(expr)
eval — اجرای expression
expr = :(3 ^ 4)
result = eval(expr)
println(result) # 81
ماکرو — قلب metaprogramming
ماکرو کد را میگیرد، تغییر میدهد و کد جدید برمیگرداند — در زمان کامپایل:
macro sayhello(name)
return :(println("سلام ", $name, "!"))
end
@sayhello "علی" # سلام علی!
ماکروهای داخلی پرکاربرد
| ماکرو | کار |
|---|---|
@time | زمان اجرا |
@show | نمایش عبارت و مقدار |
@assert | ادعا (اگر غلط، خطا) |
@which | کدام متد صدا زده شد |
@elapsed | فقط زمان (عدد) |
@show 2 + 3 # 2 + 3 = 5
@assert 5 > 3 # اگر غلط بود خطا!
function test(x)
return x^2
end
@time test(1000000) # زمان کامپایل + اجرا
چرا ماکرو؟
- سرعت: در زمان کامپایل اجرا میشوند — هزینه صفر!
- DSL: ساخت زبانهای کوچک (مثل فرمولهای ریاضی)
- ابزار: دیباگ، تست، profiling
ماکرو قدرتمند اما پیچیده است — در این دوره فقط مفهوم را میفهمید. برای شروع، از ماکروهای آماده (@time، @assert) استفاده کنید!
مثال: ماکروی زمانسنجی سفارشی
macro mytime(expr)
return quote
t0 = time()
result = $expr
t1 = time()
println("زمان: ", round((t1-t0)*1000, digits=2), " میلیثانیه")
result
end
end
@mytime sum(1:1000000)
این مبحث بخشی از دوره آموزش کامل جولیا است.