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"
Subscribe to my newsletter
Read articles from Sergey Shishkin directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Sergey Shishkin
Sergey Shishkin
Всегда чему-то учусь!