Я думаю, что это, вероятно, не является полезным методом, но я отвечу на него в любом случае.
Я также предполагаю, что &Key1..n
может иметь значения, отличные от числа, хранящегося в них, и вы хотите, чтобы эти значения были собраны в переменные &MasterKey1..n
.
Что вам нужно сделать, это использовать вложенный цикл и немного узнать о том, как разрешаются макропеременные.
%let key1=A;
%let key2=B;
%let key3=C;
%global MasterKey1 MasterKey2 MasterKey3; *so they work outside of the macro;
%macro create_master(numKeys=);
%do master=1 %to &numKeys; *Outer loop for the MasterKeys we want to make;
%let temp=;
%do keyiter = 1 %to &master; *Inner loop for the keys that fall into the MasterKey;
%let temp = &temp.&&Key&keyiter.; *&& delays macro variable resolution one time.;
%end;
%let MasterKey&master.=&temp.;
%end;
%mend create_master;
%create_master(numkeys=3);
%put &=MasterKey1 &=MasterKey2 &=MasterKey3;
Магия здесь &&
. В основном, во время разбора макропеременной вы имеете дело с одним или двумя & s за раз. Если это помогает помещать в цикле некоторые операторы %put
, чтобы увидеть, как они работают.
Для начала перейдем к концу. На этой итерации &temp=AB
&Keyiter=3
и &Key3=C
.
0. &temp.&&Key&keyiter
1. AB&Key3
2. ABC
Так от 0 до 1, анализатор видит &temp.
, период, обозначающее конец одной переменной, поэтому он смотрит на то, что: &temp.=AB
и заменяет его с AB. Затем он видит два &
s и заменяет их одним &
, но не пытается разрешить что-либо с ними. Затем он видит Key
, никаких амперсандов там нечего делать. Затем он видит &keyiter
, хорошо, замените это 3
.
Тогда от 1 до 2, он видит AB
, игнорирует его как следует. Затем он видит &Key3
(два амперсанда стали одним не забывать), и теперь он знает, что нужно решить это до C
, что и делает - таким образом ABC.
Откуда берутся второй набор значений, 1, 12, 123? – Reeza
Если я буду следовать за вами правильно, & Masterkey10 = 12345678910 и т. Д. Я не уверен, почему вы используете эту конвекцию именования, но помните, что максимальная длина имени макроса составляет 32 символа, поэтому не потребуется многого мимо этого. Возможно, стоит упомянуть, как это будет использоваться, поскольку лучшее решение, вероятно, будет доступно – Longfish
Это очень похоже на проблему в программном дизайне, а не на то, что действительно стоит решить. почему ты хочешь сделать это? Какова конечная цель программы? – Joe