1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
* XpandVectorNames.SPS.

* Макрос размещён в списке рассылки SPSSX-L 15.03.2001. Автор: Hauke Petersen hauke.petersen@INTERACTIVEMEDIA.DE.

* Макрос позволяет ссылаться на вектор переменных (переменные, именованные как, например, a1 - a40) даже если они БЕСПОРЯДОЧНО расположены в файле данных. См. комментарии в конце файла..

DATA LIST LIST /a.
BEGIN DATA
1
END DATA.
LIST.

* Пример векторных переменных, непоследовательно расположенных в файле данных.
NUMERIC a1 b02 a4 b01 a3 b03 a2.

SET MPRINT=yes.
define !xpand(!pos !tokens(1) / !pos !tokens(1) / !pos !tokens(1))
!do !i=!2 !to !3 !concat(!1,!i," ") !doend
!enddefine.

* Пример использования макроса.
* Выведем содержимое переменных в нужном порядке.
LIST !xpand a 1 4 !xpand b0 1 3.

* Если хотим, можем пересортировать переменные в файле данных таки образом, чтобы векторные переменные шли одна за другой в соответствии со своим номером.
COMPUTE dummy=1.
MATCH FILES FILE=* /BY=dummy /KEEP=!xpand a 1 4 ALL.

********************.
* Заметки Рейналя: 
********************.

* 1. Вызов макроса  !xpand должен помещаться в той же строке, что и предыдущие команды, не в новой строке. Например, следующая команда
* не будет работать, т.к. второй вызов макроса располагается в новой строке.
LIST !xpand a 1 4 
	!xpand b0 1 3.

* 2. Макрос также полезен если конструкция вроде "var1 TO var10" не работает. Например, когда нам нужен цикл вроде 
!DO !var !IN (!list)
где !list - один из макропараметров. Это может быть сделано примерно так:
define !my(list !cmdend)
!DO !var !IN (!list)
DESCRIPTIVES !var.
!doend
!enddefine.

!my list=!xpand a 1 4.