Представте себе, что у вас есть куча файлов, в которых нужно написать один и тот же код(чаще - почти один и тот-же, но с минимальными изменениями). А если к тому-же код еще и объемный? Тут на помощь и приходят макросы. Вам достаточно в одном месте создать макрос и затем вызвать его во всех файлах.
(define "macros_name" %0 код %1 код %2 ...) или (define "macros_name" %a код %b, ...)
Где:
macros_name - имя макроса.
%0, %1, %2 - переменные args.
%a, %b - явно назначенные переменные.
Вызов макроса всегда начинается с открывающихся круглых скобок!
("macros_name" args v1 v2 v3) вызов макроса и передача в него переменных args. Счетчик переменных начинается от нуля и...
("macros_name" a(1) b(2)) вызов макроса и передача в него явных переменных a и b.
Создание
(define "tth"
{projectileDamageTable {0 %a} {50 %b} {100 %c} {150 %d} {200 %e} {300 (* 0.3 %e)}}
{range %min %max}
{curve %curv}
{spreading 1
{radiusFunction
0.0 0
0.5 1
0.8 1.3
1.0 1.8
1.1 2
2.0 5
}
}
)
Вызов:
("tth" a(10) b(20) c(30) d(40) e(50) min(100) max(150) curv(gun_medium))
Тоже самое, но с "неявными" переменными:
Создание:
(define "tth"
{projectileDamageTable {0 %0} {50 %1} {100 %2} {150 %3} {200 %4} {300 (* 0.3 %4)}}
{range %5 %6}
{curve %7}
{spreading 1
{radiusFunction
0.0 0
0.5 1
0.83 1.3
1.0 1.8
1.1 2
2.0 5
}
}
)
Вызов:
("tth" args 10 20 30 40 50 100 150 gun_medium)
Т.е. во время вызова макроса, сама строка вызова мнимо заменяется этим кодом:
{projectileDamageTable {0 10} {50 20} {100 30} {150 40} {200 50} {300 (* 0.3 50)}}
{range 100 150}
{curve gun_medium}
{spreading 1
{radiusFunction
0.0 0
0.5 1
0.83 1.3
1.0 1.8
1.1 2
2.0 5
}
}
Переменные можно и не использовать, если они не нужны.
И на последок Чаще всего макросы и вызовы находятся в разных файлах. Если вы нашли вызов и не можете найти сам макрос (или наоборот) - используйте поиск по имени макроса по содержимому файлов.