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)   # زمان کامپایل + اجرا

چرا ماکرو؟

ماکرو قدرتمند اما پیچیده است — در این دوره فقط مفهوم را می‌فهمید. برای شروع، از ماکروهای آماده (@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)

این مبحث بخشی از دوره آموزش کامل جولیا است.

ابزارهای مرتبط