for ...

Sergey ShishkinSergey Shishkin
3 min read

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"

https://picolisp.tiddlyhost.com/#for

0
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

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