for ...
Всегда чему-то учусь!
for - условный цикл с локальной(ыми) переменной(ыми) и несколькими условными выходами: в первой форме значение sym сохраняется, sym привязывается к 1, и тело выполняется с увеличивающимися значениями до (и включая) num. Во второй форме значение sym сохраняется, sym впоследствии привязывается к элементам lst, и тело выполняется каждый раз. В третьей форме значение sym сохраняется, и sym привязывается к any1. Если задано sym2, оно рассматривается как переменная-счетчик, сначала привязанная к 1, а затем увеличивающаяся для каждого выполнения тела. В то время как условие any2 оценивается как не-NIL, тело выполняется повторно, и, если задано prg, sym повторно привязывается к результату его оценки. Если предложение имеет NIL или T в качестве своего CAR, второй элемент предложения оценивается как условие и - если результат NIL или не-NIL соответственно - prg выполняется и результат возвращается. Если тело никогда не выполняется, возвращается NIL.
(for sym 'num ['any | (NIL 'any . prg) | (T 'any . prg) ..]) -> any
(for sym|(sym2 . sym) 'lst ['any | (NIL 'any . prg) | (T 'any . prg) ..]) -> any
(for (sym|(sym2 . sym) 'any1 'any2 [. prg]) ['any | (NIL 'any . prg) | (T 'any . prg) ..]) -> any
Вероятно, что одна из форм называется “канонической” …
# First form:
: (for N 5 (printsp N))
1 2 3 4 5 -> 5
: (for N 5 (printsp N) (NIL (< N 3) (printsp 'enough)))
1 2 3 enough -> enough
: (for N 5 (T (> N 3) (printsp 'enough)) (printsp N))
1 2 3 enough -> enough
# Second form:
: (for X (1 a 2 b) (printsp X))
1 a 2 b -> b
: (for (I . X) '(a b c) (println I X))
1 a
2 b
3 c
-> c
# Third form:
: (for (L (1 2 3 4 5) L) (printsp (pop 'L)))
1 2 3 4 5 -> 5
: (for (N 1 (>= 5 N) (inc N)) (printsp N))
1 2 3 4 5 -> 5
: (for ((I . L) '(a b c d e f) L (cddr L)) (println I L))
1 (a b c d e f)
2 (c d e f)
3 (e f)
-> (e f)
for/2, for/3 и for/4 - предикат Pilog, генерирующий последовательность чисел.
Из примера можно сделать вывод, что “рефинемент” типа комментария, указывающего на “арность“ …
: (? (for @I 3))
@I=1
@I=2
@I=3
-> NIL
: (? (for @I 3 7))
@I=3
@I=4
@I=5
@I=6
@I=7
-> NIL
: (? (for @I 7 3 2))
@I=7
@I=5
@I=3
-> NIL
: (? (for @N T))
@N=1
@N=2
@N=3
...
А есть ещё forall, имеющий две формы
(forall 'cls . prg) -> any
(forall '(cnt . cls) . prg) -> any
Запускает prg на всех объектах базы данных класса cls, как указано в определении dbs. Во второй форме вместо этого используется файл базы данных cnt'th. Глобальная переменная This привязана к каждому объекту.
: (forall '+Item (println (: nr) (: nm)))
1 "Main Part"
2 "Spare Part"
3 "Auxiliary Construction"
4 "Enhancement Additive"
5 "Metal Fittings"
6 "Gadget Appliance"