Lisp2D
 Запуск интерпретатора
 
 
> ./lisp2d
  Запуск без параметров входит в интерактивный режим с помощью функции read-eval-print. 
  
 
> ./lisp2d filename [{ argi }]
  Пошагово выполняет все формы, хранящиеся в файле filename. Поддерживается кодировка UTF-8. Перед выполнением файла переменная arg связывается со списком строк ("filename" "arg1" … "argn").
  Во всех случаях полученный результат вычисления возвращается как код возврата программы, если результатом было значение типа char или integer, иначе код возврата - 0.
  Интерпретатор использует системную многопоточность, нити стандарта POSIX.
   Количество работающих потоков будет равно количеству процессоров. Количество записей истории вычислений равно 12. (У каждого параллельного потока.)
  История вычислений при программировании даёт большое преимущество. Видны все узлы хода программы и виден участок, в котором произошло непредвиденное действие. Скорость отладки программы увеличивается на порядок.
  (nil setdebug),(nil setdebug false),(nil setdebug 0) - отменяет запись в историю вычислений. Скорость программы увеличивается.
  (nil setdebug number) - изменяет размер истории вычислений.
  (nil getdebug) - возвращает размер истории вычислений.
 
Синтаксис
  (obj … obj) - список  
  #(obj … obj) – вектор (массив)  
  #[byte … byte] – вектор (массив) байтов
- 
"ab…z" - строка
- 
Строка имеющая специальные знаки создаётся с помощью знака \
 "the \"abc\" is string" - это одна строка
 "\\" - строка из одного знака \
 ;abc…z – комментарий до конца строки
 'obj - запрещение вычислений, цитирование.
 `obj - обратная квота (частичное запрещение вычислений).
 ,obj - вычисление внутри `.
 ,@obj - вычисление со вставкой внутри `.
 (obj . obj) - точечная пара
- 
#\c - буква (знак) c
- 
#\null - конец строки
 #\space - пробел
 #\tab - табуляция
 #\vtab - вертикальная табуляция
 #\newline - перевод строки
 #\backspace - забой
 #\return - возврат каретки
 #\feed - прогон страницы
 #\bell - звуковой сигнал
 #\escape
 
Ключевые слова и переменные окружения
  Ключевое слово может ставиться в списке аргументов перед именем переменной.
- 
&rest - связывает переменную со списком оставшихся аргументов
- 
 (nil	defmethod m (a &rest b) (cout	writeln a b))
 (nil	m 1 2 3 4) →
 1
 (2 3 4)
- 
&whole - связывает переменную с оригинальным вызовом, где не вычислены ни объект ни аргументы.
- 
>(nil	defmethod	t	(&whole	w)	(cout	writeln	"w="	w))
 (lambda	(&whole	w)	(cout	writeln	"w="	w))
 >((10	+	10)	t)
 w=((10	+	10)	t)
- 
&const - защита от изменения значения переменной. В области её видимости изменение связи на другой атом приводит к исключению. Защита внутреннего собержимого атома (чисел, строк, и т.д.) производится с помощью функции (nil const obj).
- 
(nil  defmethod t (&const c)  ('c set 0) …)
 (nil  t 1)  → исключение
nil – ничего или пустой список
 true- логическая правда
 false - логическая ложь
Глобальные переменные:
package - переменная, связывается с загружаемым файлом
 arg - переменная, связывается со списком строк, передаваемых при старте интерпретатора.
 pi=3.141592653589…  π
 e=2.718281828459…
 cin - стандартный поток ввода
 cout - стандартный поток вывода
 cerr - стандартный поток для сообщений об ошибках.
  xk-enter, xk-home, xk-end, xk-left, xk-right, xk-up, xk-down, xk-page-up, xk-page-down, xk-insert, xk-delete, xk-caps-lock, xk-shift-l, xk-shift-r, xk-control-l, xk-control-r, xk-alt-l, xk-alt-r, xk-f1, xk-f2, xk-f3, xk-f4, xk-f5, xk-f6, xk-f7, xk-f8, xk-f9, xk-f10, xk-f11, xk-f12, xk-backspace, xk-undo, xk-num-lock, xk-kp-multiply, xk-space, xk-numbersign, xk-question - коды нажатых клавиш в оконном приложении
 lambda или λ - как первый символ в списке показывает, что весь список это определение анонимной функции. Практически это может быть просто список слов. Запускать функцию или нет, решит алгоритм программы.
  В объектах:
this - значение себя (объекта)
socket-max-connections - число, может иметь значение 128
(object man [method]) - возвращает строку документации
 Типы
- 
(nil	type-of obj) - возвращает символ, обозначающий тип результата вычисления obj, для объектов возвращает имя класса
 
- 
nil - ничего (пустой список)  
 boolean  - логический.
 cons - списочная ячейка
 btree - сбалансированное бинарное дерево
 btree-node - узел сбалансированного бинарного дерева
 vector - вектор	(массив)
 byte-vector - вектор (массив) байтов
 string - строка букв
 number - число (только один тип чисел)
 symbol - символ
 char - буква
 stream - поток ввода/вывода
 stat - структура состояний файла
 socket - связь между компьютерами или процессами.
 window - окно
 time - дата и время.
 dir - обработчик каталогов.
 bif - встроенная в ядро функция.
 lock - замок.
 signal - сигнал.
 environment - окружение.
 quote - '
 backquote - `
 unquote - ,
 unquote-splicing - ,@
 
При определении типов лучше пользоваться логическими функциями:
- 
(nil	atom obj) - obj не является списочной связкой
- 
 
 (nil	atom nil) → true
 (nil	atom false) → true
 (nil	atom cons) → false
 (nil	atom obj) → obj
 
- 
(nil	= {obj}) - все obj равны nil
- 
 
 (nil	= false) → false
 (nil	= nil) → true
 (nil	= true) → false
 
- 
(nil	<> {obj}) - ни один obj не  равен nil
- 
 
 (nil	<> false) → true
 (nil	<> nil) → false
 (nil	<> true) → true
 
- 
(false	= {obj}) - равенство false 
- 
 (false	= false) → true
 (false	= nil) → false
 (false	= true) → false
 
- 
(false	<> {obj}) - ни один obj не  равен false
- 
 
 (false	<> false) → false
 (false	<> nil) → true
 (false	<> true) → true
 
- 
(true	= {obj}) - равенство true 
- 
 (true	= false) → false
 (true	=	nil) → false
 (true	= true) → true
 (true	= 12) → false
 
- 
(true	<> {obj}) - ни один obj не  равен true
- 
 
 (true	<> false) → true
 (true	<> nil) → true
 (true	<> true) → false
 
- 
(nil booleanp obj) - возвращается true если obj это true или false.
- 
(nil  booleanp  false) → true
 (nil  booleanp  1) → false
- 
(nil	stringp obj) - obj строка
- 
(nil	stringp "ab") → "ab"
 (nil	stringp 1) → false
 
- 
(nil	charp x) - буква
- 
(nil	charp #\t) → #\t
 (nil	charp true) → false
 
- 
(nil	listp obj) - соответствия списочной ячейке или nil
- 
(nil	listp nil) → true
 (nil	listp 1) → false
 (nil	listp '(1 . 2)) → (1 . 2)
 
- 
 (nil	consp obj) - соответствия списочной ячейки
- 
 (nil	consp 1) → false
 (nil	consp '(1)) → (1)
 
 (nil  btreep obj) - соответствия сбалансированную бинарному дереву. Возвращает дерево или false.
 (nil  btree-nodep obj) - соответствия узлу сбалансированного бинарного дерева. Возвращает узел или false.
- 
(nil	vectorp obj) - соответствия вектору
- 
 (nil	vectorp #(1 2)) → #(1 2)
 (nil	vectorp 1) → false
 
- 
(nil byte-vectorp obj) - соответствия байт-вектору
- 
 (nil  byte-vectorp #[1 2]) → #[1 2]
 (nil byte-vectorp 1) → false
 
(nil	symbolp obj) - соответствия символу
(nil	numberp obj) – число
- 
(nil	streamp obj) - поток
- 
(nil	streamp notstream)→false
 (nil	streamp stream)→stream
 
(nil statp [x]) - если x является структурой stat, возвращается x, иначе false.
(nil socketp obj) – связь между компьютерами или процессами.
(nil	objectp obj) – объект класса
- 
(nil	windowp x) - соответствия окну
- 
 (nil	windowp win) → win
 (nil	windowp 1) → false
 
(nil	timep obj)
(nil	dirp obj)
(nil	bifp obj)
(nil	lockp obj)
(nil	signalp obj)
(nil	envp obj)
(nil	quotep obj)
(quote setf quote)
(quote swap quote)
(nil	backquotep obj)
(backquote setf backquote)
(backquote swap backquote)
(nil	unquotep obj)
(unquote setf unquote)
(unquote swap unquote)
(nil unquote-splicingp obj)
(unquote-splicing setf unquote-splicing)
(unquote-splicing swap unquote-splicing)
Символы
  Символы это вспомогательный объект для программирования, в "Чистом Лиспе" символов нет. Они могут иметь значения: обычные и функциональные, у них имеется вспомогательные свойства.
- 
(symb	<>	[s1 … sn]) – ни один символ si не равен symb
- 
(nil not (symb <>	[s1 … sn])) - по крайней мере один из символов si равен главному объекту symb 
(symb	= [symb…symb]), (symb	<	[symb…symb]), (symb	<= [symb…symb]), (symb	>	[symb…symb]), (symb	>=	[symb…symb]) - сравнения (по алфавиту).
(symb	min symb … symb), (symb	max symb … symb) - минимальный/максимальный (по алфавиту).
- 
(symb + {symb|string|char}) - новый символ
- 
(('abc + '- 'def)	set	1)=('abc-def	set 1)
 
- 
(symb - symb … symb) – новый символ
- 
(('abcdef - 'cd)	set	1)=('abef	set 1)
 
(string|char	symbol) -  возвращает символ с именем string|char.
- 
 (symbol	put prop val) – устанавливает свойство prop символа symbol со значением val , возвращает val
- 
Свойство символа находится только в текущем пространстве имён.
 ('work1	namespace
 (symbol	put prop propv))
 ('work2	namespace
 (symbol	get prop)) → NIL
 
- 
(symb	get prop) - свойство символа symb с именем prop. При отсутствии данного свойства возвращается NIL
- 
При вхождении нескольких пространств имён возвращается первое попавшее свойство.
 ('std	namespace
 (symb	put prop propv)
 …
 ('another	namespace
 (symb	get prop) → propv
 …))
 
(symb	remprop prop) - удаляет свойство символа symb с именем prop. Если удаляемого свойства нет - возвращается false иначе true. Удаляется свойство только в текущем пространстве имён.
(symb	properties) - возвращает все свойства символа как #((symb . value)…) , пары в векторе отсортированы по symb 
(symbol	boundp [env]) – есть ли у символа значение. Возвращает true или false.
(nil|symbol	gensym) - Функция-генератор разных символов, начинающихся на symbol, если начальный символ не указан начинается на t. Гарантируется, что возвращаемый символ является новым.
Константы
  Переменной можно установить свойство быть константой. Предназначено для ясности алгоритма, какие переменные не нужно менять. При попытке менять значение переменной будет возникать исключение. Быть константой это временное состояние, можно отменить константность, проверять свойство переменной.
- 
(symbol  const) - ставит переменной флаг константы. Возвращает символ при успехе, исключение при отсутствии значения переменной.
- 
('x set (nil  localtime))
('x const)
('x set 0) → Исключение
('y const) → Исключение
- 
(symbol  unconst) - отменяет у переменной флаг константы. Возвращает символ при успехе,  исключение при отсутствии значения переменной.
- 
('pi unconst)
('pi  set "Me")
('x unconst) → Исключение
- 
(symbol  constp) - проверяет у переменной флаг константы. Возвращает true, false или исключение при отсутствии значения переменной.
- 
('x set 0)
('x constp) →  false
('pi  constp) →  true
('y constp) → Исключение
  Самому атому можно ставить флаг константы (а не ссылке на него). Применяется при использовании  изменения атомарного объекта. (функциями: += , setf , swap , move , setfirst , setrest , resize , setelt , и т.д.)
  При попытке изменить константный атом возникнет исключение.
(nil  const obj) - ставит атому флаг константы.
(nil  unconst obj) - отменяет свойство константы. Приводит к ошибке при использовании на аргумент: nil, false, true или любой символ.
(nil  constp obj) - возвращает true если obj это константа или иначе false.
Установка значений
 (nil  let (([&const] var1 [{body1}])|var1…([&const]  varn [{bodyn}])|varn) [{main-body}]) - создаёт параллельно локальные связи переменных vari со значениями (nil progn [{bodyi}]) и пошагово вычисляет формы main-body. Переменные без значения [{bodyi}] инициализируются значением nil. Если перед именем переменной стоит символ &const дальнейшее изменение значения приведёт к исключению.
- 
 (symbol	set val [env]) - изменяет значение переменной. Если такой переменной ещё нет, она создаётся в текущем окружении. Возвращается значение val.
- 
(('(x	y)	first)	set	1)≈(nil setq x 1)
- 
(var	letset val) - присваивание значений переменной var в текущем окружении (не трогает значение переменной выше). Имя переменной var вычисляется. Результатом будет val
- 
Применяется при запоздании определения переменных формы let:
 ('x	set 1)
 (nil	let ()
 …
 ('x	letset	-2)
 …)
 x → 1
 
- 
(nil|environment	setq [{symb val}]) - изменяет значение переменных. Если какой-то переменной ещё нет, она создаётся в текущем окружении. Символы symb не вычисляются. Аргументы val вычисляются параллельно. Возвращается nil.
- 
(nil	setq x	(10	-	1)  y (2  / 3))
 x → 9
 y → 2/3
(nil environment) - текущее окружение.
(nil environment-external) - внешнее окружение.
Формы управления
 (nil	progn b1 … bn) - пошаговое вычисление b1 … bn , возвращает результат вычисления bn после вычисления всех форм b1…bn.
- 
 (nil	parallel task … task) - параллельное вычисление задач task. После завершения всех задач возвращается nil.
 (nil	fork {body}) - создаёт новую задачу (nil progn {body}), не ожидает результата и возвращает nil. Главная задача не сможет словить исключения подзадачи.
- 
(nil	if test then else [uncert]) - вычисляет test, если результатом будет утвердительный объект (не false и не nil), то дальнейшее действие будет вычисление тела then. Если результатом вычисления test будет false, то будет выполнятся else. Оставшийся вариант результата это nil, при присутствии задачи uncert будет выполнятся оно, иначе else.
- 
 
(nil	if) →nil
 (nil	if test)=(nil	progn test nil)
 (nil  if  true  1 2 3)  →  1
 (nil  if  false  1 2 3)  →  2
 (nil  if  nil  1 2 3)  →  3
 (nil  if  nil  1 2)  →  2
 
- 
(nil	when test {work})=(nil	if	test	(nil	progn	{work})) - если будет положительным результат вычисления test, вычисляет пошагово задачи work.
- 
 (nil	cond (test1 [{form1}])|atom … (testn [{formn}])|atom) - пошагово вычисляются testi пока не найдется не false и не nil значение. Возвращает результат последнего вычисления соответствующей формы formi. Если formi не указана, возвращается результат вычисления testi. Предоставленые аргументы: атомы - игнорируются. 
- 
(nil	cond (false 1) ignore) →nil
 (nil	cond (false 1) (nil (cout	write …))) → nil
 (nil	cond (false 1) (ok oking)) → вычисление oking
 (nil	cond (false 1) (ok)) → ok
 (nil	cond (false 1) (notok oking) (true default)) → вычисление default
'obj - блокируется вычисление obj.
(nil|environment	eval obj) - двойное вычисление. Сначала obj вычисляется как аргумент функции eval, затем возвращается результат вычисления интерпретатором полученного значения в окружении environment.
(nil|environment apply obj fn arglist) - применение функции fn к аргументам arglist. Значением переменной fn может быть имя или лямбда список. Аргументы и объект вычисляются только один раз.
(nil|environment funcall obj fn [{arg}]) - применение функции fn к аргументам arg. Значением переменной fn может быть имя или лямбда список. Аргументы и объект вычисляются только один раз.
- 
`obj - частичное запрещение вычислений аргумента obj. Когда внутри формы obj встречается запись ,x - то подформа x вычисляется и подставляется в форму obj. Также есть запись ,@x - она означает что значение x как список подставляется по-элементно в форму obj.
- 
('l	set	'(1	2	.	3))
 `(0	,l	,@l)→(0	(1	2	.	3)	1	2)
- 
,obj - вставка внутри формы `.
- 
,@obj - вставка с развёрткой внутри формы `.
- 
`(a ,@'(1 + 1) b c)→(a 1 + 1 b c)
 (string	load	[arg1 … argn]) - считывает файл с именем string, вычисляет и возвращает соответствующий результат. Перед вычислением переменная arg связывается со списком аргументов (arg1 … argn). После вычисления восстанавливается предыдущее значение arg.
(string	save	obj) – записывает объект obj в формате печати в файл с именем	string.
- 
(nil	do-while {body} test) - циклическое вычисление форм body, если последним результатом будет nil или false,то вычисления прекращаются и результатом будет это значение.
 
- 
Остановить цикл внутри тела удобнее с помощью исключений.
 (nil try (nil do-while … (nil throw 'break) … ) break last-task)
- 
(nil	while test {body}) – пошаговый условный цикл. Проверяется test, если test=false или nil то результатом будет это значение. Потом пошагово выполняются формы body, затем шаг на проверку test.
 
- 
Остановить цикл внутри тела удобнее с помощью исключений.
 (nil try (nil while … (nil throw 'break) … ) break last-task)
- 
(nil	try task-body {exception-name exception-body}) - запускается задача task-body. Если в процессе вычисления было исключение запускается задача exception-body. Имена исключений exception-name не вычисляются. Проверка имени производится с помощью идентичности eq. Если не поставлено имя текущего исключения, никаких дополнительных задач не будет и исключение остаётся. Последним именем можно поставить nil, тогда любое исключение будет обрабатыватся.
- 
(nil	try	(nil	setq	result	(nil	eval	task))	nil	(nil	setq	error	true)) - если при интерпретировании задачи task произошла ошибка, ставится флажок error.
- 
(nil	throw	[{exception}]) - вычисляются аргумент, устанавливается исключение.
- 
(nil	throw) → nil
 (nil	throw x) → значение x
 (nil	throw x y) → список значений x и y
 
- 
(nil	exception) - возвращается текущее исключение.
- 
(nil	try	(nil	eval	task)	nil	(cerr	writeln	"exception: "	(nil	exception)))
- 
(nil	exception-history) - возвращается история сообщений в момент, когда произошло исключение. Вне блока try возвращается nil. Размер истории сообщений для каждого параллельного потока ограничено. (см. getdebug и setdebug)
- 
(nil  try (nil  eval  task)
  nil (nil progn
    (cerr writeln "exception-history: ")
    ((nil exception-history)  for*  history-i (cerr print history-i))
  )
)  
- 
(nil log [{obj}]) - аргументы obj вычисляются. Добавляется к истории вычислений элемент, как список результатов аргументов obj. Возвращается nil.
 Для получения текущего списка сообщений можно использовать метод log-list.
- 
- 
(nil log-list) - возвращается список сохранённых сообщений (созданных с помощью log). Не предназначена для обработки исключений. (см. exception-history) Размер истории сообщений для каждого параллельного потока ограничено. (см. getdebug и setdebug)
- 
  При возникновении исключений сообщения параллельных потоков не видны. Ни старые сообщения ни новые (после исключения в данном потоке). Видны только родительские. При ручном вызове log-list так-же не будет изыматься из множества других потоков логистическая информация. У каждого последовательного потока есть лимит сообщений. Видны будут только последние.
  Данная сборка информации предназначена только для временного поиска ошибки программы. Глобальная сборка всех сообщений со всех потоков приведёт к замедлении их работы и огромному количеству информации.
 
Логика
  Трёх-значная логика определяется с помощью объектов nil, false, true. Символ true - определяет истину, false - ложь , nil - неопределённость. Любой другой объект представляется как истина.
- (nil	not obj)=(nil  ¬ obj) - отрицание. ¬ = ((172 char) symbol) 
- 
| x | not x | 
|---|
 | false | true |  | nil | nil |  | true | false |  
 
- 
 (nil	not nil) → nil
 (nil	not false) → true
 (nil	not true) → false
 (nil	not 1) → false
 
- (nil	or a b … z)=(nil  ∨ a b … z) - выбирается максимальное значение в порядке: false → nil → true. ∨ = ((8744 char) symbol) 
- 
| x or y | false | nil | true | 
|---|
 | false | false | nil | true | 
|---|
 | nil | nil | nil | true | 
|---|
 | true | true | true | true | 
|---|
 
 
- 
 
 (nil	or) → false
 (nil	or nil) → nil
 (nil	or true) → true
 (nil	or false) → false
 (nil  or  1)  →  1
 (nil	or false nil) → nil
 (nil	or false nil 123) → 123
- (nil nor a b … z)=(nil  ⊽ a b … z)=(nil not (nil or a b … z))=(nil and {(nil not …)}) - если в аргументах попадётся утверждение возвращается false. Если все аргументы false возвращается true. В оставшемся варианте с аргументами nil возвращается nil. ⊽ = ((8893 char) symbol) 
- 
| x nor y | false | nil | true | 
|---|
 | false | true | nil | false | 
|---|
 | nil | nil | nil | false | 
|---|
 | true | false | false | false | 
|---|
 
 
- 
(nil	and [a [b … [z]]])=(nil ∧ [a [b … [z]]]) - выбирается минимальное значение в порядке: true → nil → false. ∧ = ((8743 char) symbol) 
- 
| x and y | false | nil | true | 
|---|
 | false | false | false | false | 
|---|
 | nil | false | nil | nil | 
|---|
 | true | false | nil | true | 
|---|
 
 
- 
(nil	and) → true
 (nil	and nil) → nil
 (nil	and false) → false
 (nil	and 123) → true
 (nil	and 123 nil) → nil
 (nil	and 123 nil false) → false
- 
(nil nand [a [b … [z]]])=(nil ⊼ [a [b … [z]]])=(nil  not (nil and [a [b … [z]]]))=(nil  or  {(nil not …)}) - если в аргументах попадётся false возвращается true. Если все аргументы утвердительные возвращается false. В оставшемся варианте с аргументами nil возвращается nil. ⊼ = ((8892 char) symbol) 
- 
| x nand y | false | nil | true | 
|---|
 | false | true | true | true | 
|---|
 | nil | true | nil | nil | 
|---|
 | true | true | nil | false | 
|---|
 
 
- 
(nil	xor a b … z)=(nil ⊻ a b … z) - возвращает единственное утвердительное значение. Если попалось больше чем одно возвращается false. При наличии аргументов nil - результат nil. ⊻ = ((8891 char) symbol) 
- 
| x xor y | false | nil | true | 
|---|
 | false | false | nil | true | 
|---|
 | nil | nil | nil | nil | 
|---|
 | true | true | nil | false | 
|---|
 
 
- 
 
 (nil	xor) → false
 (nil	xor nil) → nil
 (nil	xor false) → false
 (nil	xor 123) → 123
 (nil	xor false false) → false
 (nil xor false nil) → nil
 (nil	xor false 123) → 123
 (nil xor  nil nil) → nil
 (nil	xor 123 234) → false
 (nil	xor  nil 123) → nil
 (nil	xor false 1 false false) → 1
 (nil	xor false 1 false nil) → nil
 (nil xor false 1 false 2) → false
- 
(nil imply x y)=(nil -> x y) - импликация.
- 
| x → y | false | nil | true | 
|---|
 | false | true | true | true | 
|---|
 | nil | nil | nil | true | 
|---|
 | true | false | nil | true | 
|---|
 
 
- 
(nil	eq a b) - физическое равенство двух объектов (равенство указателей)
- 
 (nil	eq) → true
 (nil	eq a) → (nil	=	a)
 (nil	eq nil nil) → true
 (nil	eq false false) → true
 (nil	eq 1 1) → false
 (nil	eq 'sym 'sym) → sym
Числа
12 - целое.
12.3 - с дробной частью.
2/3 - дробь.
1/2/3 - одно целое плюс две трети.
1/2/3e20=(1+2/(3*1020))=(1+1/(15*1019)) - с экспонентой.
1+2/3i, 1/3i, -7i+1e100 - комплексные.
- 
(a	+ b c … z) - сложение a+b+c+…+z.
- 
(a	+) → a
 (a	+	1	2) → a+3
 (2/3	+	1) → 1/2/3
 (1+2i	+	1+1i) → 2+3i
- 
(a	- b c … z) - вычитание a-b-c-…-z.
- 
(a	-) → -a
 (a	-	1	2) → a-3
 (2/3	-	1) → -1/3
 (1+2i	-	1+1i) → 1i
- 
(a * b … z) – умножение.
- 
(a	*) → a
 (a	*	2	3) → a*6
 (1+2i	*	2i) → -4+2i
- 
(a / b … z) - деление на все остальные числа.
- 
(a	/) → 1/a
 (a	/	2	3) → a/6
 (1	/	2/3) → 1.5
 (1	/	1+2i) → 0.2-0.4i
- 
(a = b … z) – равенство a=b=…=z.
- 
(2 = 2) → 2
 (2 = 3) → false
- 
(n <> x1 … xk) - ни одно число xi не равно n.
- 
(nil  not (n <> x y z)) - число равно одному из аргументов.
(a < b … z) - числа возрастают a<b<…<z. Возвращается объект (число) или false или nil.
(a > b … z) - числа убывают a>b>…>z. Возвращается объект (число) или false или nil.
 (a <= b … z) - меньше или равно (не убывают) a≤b≤…≤z. Возвращается объект (число) или false или nil.
 (a >= b … z) - больше или равно (не возрастают) a≥b≥…≥z. Возвращается объект (число) или false или nil.
(x nanp) – предикат на 0/0.
(x infp) – предикат на ±∞.
(x finitep) – предикат на конечное число, не ±∞ и не 0/0.
- 
(number	integerp) - целое число.
- 
(1.5	integerp) → false
 (2	integerp) → 2
 (1/0	integerp) → nil
- 
(number	realp) - не комплексное число.
- 
(1.5	realp) → 1.5
 (2i	realp) → false
- 
(number	evenp) - предикат, на чётность.
- 
(3	evenp) → false
 (-4	evenp) → -4
 (3.5	evenp) → nil
 
- 
(number	oddp) - предикат, на нечётность.
- 
(4	oddp) → false
 (-5	oddp) → -5
 (3.5	oddp) → nil
 
(numb min numb … numb), (numb max numb … numb) – минимальное/максимальное число.
- 
(a abs) – абсолютное значение.
- 
(2 abs) → 2
 (-3 abs) → 3
 (3+4i	abs)	→	5
- 
(x ceil [d]) - наименьшее целое, не меньшее x. В комплексном числе округление идёт в действительной части и в мнимой. (ceilingeng=потолок).
- 
 
	(-2.5 ceil) → -2
 (2.5 ceil) → 3
 (7 ceil 2)=((7	/	2)	ceil) → 4
 (2 ceil) → 2
 (4.5+3.5i ceil) → 5+4i
 (4.5+3.5i ceil 2-1i) → 2+3i
- 
(x floor [y]) - округление x в меньшую сторону до целого числа. Если дано y то возвращается целая часть от деления x на y. В комплексном числе округление идёт в действительной части и в мнимой. (flooreng=пол).
- 
 (-2.5 floor) → -3
 (13 floor 4) → 3
 (-13 floor 4) → -4
 (4.5+3.5i floor) → 4+3i
 (4.5+3.5i floor 2-1i) → 1+2i
- 
(x trunc [y]) - округление x до ближайшего целого числа в сторону нуля. Если дано y то возвращается результат функции от деления x на y. В комплексном числе округление идёт в действительной части и в мнимой. (truncateeng=обрезать).
- 
 
(2.5 trunc) → 2
 (-2.5 trunc) → -2
 (13 trunc 4) → 3
 (-13 trunc 4) → -3
 (4.5+3.5i trunc) → 4+3i
 (-4.5-3.5i trunc 2-1i) → -1-2i
- 
(x % [y])=(x mod [y]) - остаток от деления x на y.
- 
 (13 % 4) → 1
 (-13 % 4) → 3
 (13 % -4) → -3
 (-13 % -4) → -1
 (13.4 % 1) → 0.4
 (-13.4 % 1) → 0.6
 (2.3 %)=(2.3 % 1) → 0.3
 (2.5+3.5i %) → 0.5+0.5i
 (2.5+3.5i % 1i) → -0.5+0.5i
- 
(x gcd [{xi}]) - наибольший общий делитель целых чисел, возвращает положительное целое число.
- 
 
 (3 gcd)=3
 (-10 gcd) =10
 (12 gcd -8) =4
 (32 gcd 16 3) =1
- 
(x lcm [{xi}]) - наименьшее общее кратное целых чисел, возвращает положительное целое число.
- 
 
 (3 lcm)=3
 (-10 lcm) =10
 (12 lcm -8) =24
 (32 lcm 16 3) =96
- 
 (x sin [eps]) – синус с точностью eps>0.
[result-eps…result+eps]
- 
По умолчанию точность 2^-64. Log10(2^64) = 19 цифр.
 (1 sin) → 17152820301/20384327696
 (1 sin 0.1) → 5/6
 
- 
 (x cos [eps]) – косинус с точностью eps>0.
[result-eps…result+eps]
- 
По умолчанию точность 2^-64. Log10(2^64) = 19 цифр.
 (1 cos) → 3559790192/6588515639
 (1 cos 0.1) → 0.5
 
(x tan) – тангенс.
(x cot) – котангенс.
(x arcsin)=sin-1x
(x arccos)=cos-1x
(x arctan)=tg-1x
(x arctan	y)=tg-1(x/y) ,y>0 ,x>0
(x sinh)=(ex-e-x)/2
(x cosh)=(ex+e-x)/2
(x tanh)=sinh(x)/cosh(x)
(x coth)=cosh(x)/sinh(x)
(x arsinh)=sinh-1x
(x arcosh)=cosh-1x
(x artanh)=tanh-1x
- 
(x sqrt [eps])=(x √ [eps]) - квадратный корень √x с относительной точностью eps>0.
[result*(1-eps)…result*(1+eps)]
- 
По умолчанию точность 2^-64. Log10(2^64) = 19 цифр.
 (x sqrt 1) ≈ Floor[sqrt(x)]
 (2 sqrt 0.1) → 1.4
 (2 sqrt) → 1/3166815962/7645370045
 Высокая точность займёт на вычисления больше времени.
 (2 sqrt 1e-38) → 1/4866752642924153522/11749380235262596085
 Существуют два результата, возвращается положительный.
 (9 sqrt) → 3
 Другой: -3
 (8i sqrt) → 2+2i
 Другой: -2-2i
 
- 
(x cbrt [eps])=(x ∛ [eps]) - кубический корень ∛x с относительной точностью eps>0.
[result*(1-eps)…result*(1+eps)]
- 
(2 cbrt) → 1/914705237/3519165675
 По умолчанию точность 2^-64. Log10(2^64) = 19 цифр.
 (2 cbrt 0.1) → 1.25
 Существуют три результата. Если число не мнимое, возвращается не мнимый результат.
 (8 cbrt) → 2
 Если число чисто мнимое (real=0), возвращается чисто мнимый результат.
 (8i cbrt) → -2i
 Чтобы получить все три результата нужно поворачивать комплексное число на угол ⅔π.
 (nil  let ((x (2-2i cbrt)))
 (cout writeln x)
 (cout writeln ((x abs) polar ((x arg) + (pi * 2/3))))
 (cout writeln ((x abs) polar ((x arg) - (pi * 2/3))))) →
 -1-1i
 1.36602540378-0.366025403784i
 -0.366025403784+1.36602540378i
 
 
 (x exp) – экспонента ex
(b	^ n) – степень bn
(x log [a])=logax - логарифм по основанию a (по умолчанию натуральный логарифм).
- 
(x ln [eps]) - натуральный логарифм с точностью eps.[result-eps…result+eps] По умолчанию точность 2^-64. Log10(2^64) = 19 цифр.
- 
(2 ln) → 6350113169/9161276778
 (2 ln 0.1) → 5/7
 
- 
(n	string	[digc])	-	возвращает строку, которая точно представляет число. Может быть в дробном виде. При необходимости устанавливается максимальное количество цифр digc.
- 
(4/6	string) →	"2/3"
 (4/6	string	2) →	"6.7e-1"
 (4/6	string	0) →	"6.66666666667e-1" ; 12 цифр
(x	!)=1*2*…*x – факториал.
- 
(nil	random) - возвращает случайное вещественное число, в интервале [0…1).
- 
(nil	random)	→	0.102355897908
- 
(numb	random) - возвращает случайное вещественное число, меньшее по абсолютному значению, чем numb.
- 
(pi	random)	→	2.0939049352352
 (-3	random)	→	-1.194246236960
- 
(numb  randomcomplex) - возвращает случайное комплексное число, меньшее по абсолютному значению, чем abs|numb|.
 Распределение равномерное.
- 
(10 randomcomplex) → -5.74660815753-7.37486568128i
 (10i randomcomplex) → 0.108014340751-4.54071316933i
- 
(среднее  random-normal отклонение) - возвращает случайное число, с нормальным распределением. 
- 
(0 random-normal 1) → -0.1411..
 (0 random-normal 1i) → -0.2241..i
 (1+1i random-normal 1+1i) → 0.8483..+0.8483..i
 
- 
(number	for symbol	{body})=(number  ∀ symbol {body}) – параллельно локальным переменным symbol (для каждого процесса своя переменная symbol) присваиваются числа 0…number-1, при каждом значении вычисляются пошагово формы body. ∀=((8704  char) symbol)
- 
(3	for i (cout	write " i+1=" (i	+	1))	(i	+	1)) → 
 i+1=2 i+1=1 i+1=3
 → nil
 Остановить цикл внутри тела удобнее с помощью исключений.
 (nil try (number	for … (nil throw 'break) … ) break last-task)
- 
(number	for* symbol	{body}) – пошагово локальной переменной symbol присваиваются числа 0…number-1, вычисляются пошагово формы body. Возвращается последний результат формы body.
- 
(3	for* i	(cout	writeln "i=" i "..")) → 
 i=0..
 i=1..
 i=2..
 Остановить цикл внутри тела удобнее с помощью исключений.
 (nil try (number	for* … (nil throw 'break) … ) break last-task)
- 
(number	setf number)=(number number number) - физически меняет число новым значением. Возвращается модифицированный объект. Использование данной операции чревато ошибками программирования.
- 
('x	set	7) → 7
 ('y	set	(nil	list	x x x)) → (7 7 7)
 (x setf (x - 1)) → 6
 y → (6 6 6)
 Для избежания порчи работающей программы следует пользоваться функцией копирования:
 (nil let ((x 0)) … → (nil let ((x (0 copy))) …
 ('x set 0) → (x setf 0)
 (nil	setq	x 0) → (x setf 0)
- 
(number  swap number) - физически меняет значения чисел. Смена производится очень быстро. Использование данной операции чревато ошибками программирования.
- 
('x set 3) → 3
 ('y set 4) → 4
 ('z set (nil  list  x y)) → (3 4)
 (x swap y) → 4
 x → 4
 y → 3
 z → (4 3)
- 
(number	copy)=('number newobject number) - возвращает новое число.
- 
('number newobject)≈(0 copy)
 ('number newobject number)=(number copy)
 ('number newobject number number) → C(number number)
- 
(number += [{x}])≈(number setf (number + [{x}]))
- 
(number -= [{x}])≈(number setf (number - [{x}]))
- 
(number *= [{number}])≈(number setf (number * [{number}]))
- 
(number /= [{number}])≈(number setf (number / [{number}]))
- 
(number degrees)=number*180/π
- 
(number radians)=number/180*π
- 
(n combin x)=C(x,n)=n!/x!/(n-x)!
- 
(n combina x)=n!/(n-x)!
- 
(x multinomial y … z)=(x+y+…+z)!/x!/y!…/z!
- 
(number round [diff]) - возвращает округление: [number-diff … number+diff]
- 
>(pi round 1e-3)
 3/15/106
 >(e round 1e-3)
 2.71875 ; = 2/23/32
 (x round 1) = [x]
 (x round)=(x round 0.5) = [x+0.5]
- 
(number num) - положительный целый числитель числа. (num=numeratoreng)
- 
(number denom) - положительный целый знаменатель числа. (denom=denominatoreng)
- 
(number real) - вещественная часть числа. x+yi → x
- 
(number imag) - мнимая часть числа. x+yi → y
- 
(number conj) - сопряжение числа. x+yi → x-yi
- 
(abs polar arg) - число в тригонометрической форме. abs*(cos(arg)+i*sin(arg))
- 
(number arg) - аргумент arg(number) число -π…π
- 
(number erf) - функция ошибок нормального распределения (Гаусс):
 erf(x) = 2/√π∫0x(ⅇ-t2)ⅆt возвращает число [-1..1]
- 
(number inverf) - обратная функция ошибок нормального распределения из [-1..1] в [-∞..∞]: 0.999979 → 3
Список
- 
(list	first) - возвращает первую часть списка list. 
 
- 
('(1 2 3)	first)→1
 (nil	first)→nil
- 
 (list	rest) - возвращает хвостовую часть списка list. 
 
- 
('(1 2 3)	rest) → (2 3)
 (nil	rest)→nil
(list	second)=((list	rest)	first)
(list	third)=(((list	rest)	rest)	first)
- 
 (list	size) - возвращает длину списка list (количество списочных ячеек).
- 
(nil	size) → 0
 (nil	cons	first rest) - создаёт списочную ячейку с соответственными ссылками.
('cons newobject first rest)=(nil	cons	first rest)
('cons newobject another-cons)=(another-cons	copy)
('cons newobject)=(nil cons nil nil)
- 
(list	elt [{integer}]) - возвращает элемент списка listinteger,…. Элементы списка нумеруются: 0 - first(list) 1 - second(list) … (size-1) – first(last(list)).
- 
('((1 2)	(3 4))	elt) → ((1 2)	(3 4))
 ('((1 2)	(3 4))	elt	0) → (1 2)
 ('((1 2)	(3 4))	elt	0	1) → 2
 ('((1 2)	(3 4))	elt	0	1	2) → nil
 
(nil	list arg1 … argn) - возвращает список аргументов (arg1 … argn), аргументы вычисляются параллельно
- 
 (nil	list* arg1 … argn) - возвращает список аргументов (arg1 … argn-1 . argn), последний аргумент соединяется как хвост, аргументы вычисляются параллельно
- 
(nil	list* 'a 'b '(c d e)) → (a b c d e)
- 
 (list	last) - возвращает последнюю списочную ячейку
- 
('(1 2 3)	last) → (3)
 ('(1 2 . 3)	last) → (2 . 3)
 ('()	last) → nil
- 
(list + [{list}]) - возвращает объединение списков list. Все списки не разрушаются. 
- 
('(1 2 3) + '(4 5 6)) → (1 2 3 4 5 6)
 ('(1 2 3) + ’atom '(a) nil '(dotted	.	list)) → (1 2 3 a dotted . list)
- 
(list	reverse) – создаёт новый список с обращением порядка элементов. Зацикленный список не поддерживается.
- 
('(1 2 3 . tail)	reverse) → (3 2 1)
 
- 
(list	cycledp) – Проверка на зацикленный список. Время выполнения O(n).
- 
(nil setq l '(1 2 3))
 (l cycledp) → false
 (((l rest)rest)setrest l)  → (3 1 2  .. 3 1 2  ... )
 (l	cycledp) → (1 2 3  .. 1 2 3  ... )
- 
(list	remove	elt) – удаляет из списка элементы удовлетворяющие равенству (elt = listi),  возвращает новый список без данных элементов
- 
('(1 2 3)	remove 2)	→	(1 3)
- 
(list	substitute	old new) – замена элементов old на new (при сравнении используется метод =). Возвращает новый список.
- 
('(a x x a)	substitute 'x 'b)	→	(a b b a)
(cons	copy) - копия одного звена списка.
(list	copy-list) - возвращает новый список. Копируются только ячейки верхнего уровня. Копирование зацикленных списков не поддерживается. Время выполнения O(n).
(list	copy-list-protected) - возвращает новый список. Копируются только ячейки верхнего уровня. Поддерживается копирование зацикленных списков. Время выполнения O(n²).
(list	copy-tree) - возвращает новое дерево. Копируются все ячейки, и first и rest.
- 
(list	subseq  [indexfirst [indexend]]) - без аргументов возвращает копию списка. С одним аргументом возвращает новый список из элементов начиная с индекса indexfirst. Индексы это целые числа, нумерация начинается с нуля. Второй индекс представляет предельное значение. Элемента списка по данному индексу в результате не будет.
- 
('(0 1 2 3) subseq) →  (0 1 2 3)
 ('(0 1 2 3) subseq 1) →  (1 2 3)
 ('(0 1 2 3) subseq 1 2) →  (1)
- 
(list  without [iteratorlimit]) - без аргумента возвращает копию списка. Возвращает новый список из элементов начиная с начала без элементов, представленных аргументом. Итератор это предельная ячейка списка.
- 
(nil  setq  l '(a b c d))
 ('i  set (l  rest)) →  (b c d)
 (l without i) →  (a)
 ('j  set (i  rest)) →  (c d)
 (l without j) →  (a b)
- 
 (cons	setfirst newfirst) - заменяет головную часть списка cons объектом newfirst
 
- 
- 
 (list	setrest newrest) - заменяет хвостовую часть списка list объектом newrest. Если list элемент вашей программы, то надо знать, что эти процедуры изменяют саму программу и тяжело представить как она потом выглядит. Чтобы у вас не было ошибок используйте в программе не (nil	let ((l '(nil	progn)… а (nil	let ((l (list	nil	'progn)…
- 
(cons	cons first rest)=(cons setfirst first),(cons setrest rest)
 (cons	cons another-cons)=(cons setf another-cons)
- 
(consthis	setf consarg)=(consthis setfirst (consarg first)),(consthis setrest (consarg rest)) - заменяет части ячейки на новые, предоставленные consarg. Использование данной операции чревато ошибками программирования.
- 
(consthis  swap consarg) - меняют ссылки списочных ячеек. Использование данной операции чревато ошибками программирования.
- 
(list	+= [{list}]) - все списки объединяет, разрушает их структуру, кроме последнего. Возвращает объединённый список. Зацикленные списки не поддерживаются.
- 
('list1 set '(a b . c))
 ('list2 set '(c d . e))
 ('list3 set '(e f . g))
 (list1 += list2 list3)
 list1 → (a b c d e f . g)
 list2 → (c d e f . g)
 list3 → (e f . g)
- 
(list	for* symbol	{body}) – пошагово локальной переменной symbol присваиваются элементы списка list, вычисляются пошагово формы body. Возвращается последний результат формы body.
- 
('(1	2	3)	for* i	(cout	writeln "i=" i "..")) → 
 i=1..
 i=2..
 i=3..
 Остановить цикл внутри тела удобнее с помощью исключений.
 (nil try (list	for* … (nil throw 'break) … ) break last-task)
- 
(list	for symbol	{body}) – параллельно локальным переменным symbol (для каждого процесса своя переменная symbol) присваиваются элементы списка list, при каждом значении вычисляются пошагово формы body. Зацикленные списки не поддерживаются.
- 
('(1 2 x) for i (nil if (nil not (nil numberp i)) (cout writeln i " is not number"))) → 
 x is not number
 nil
 Остановить цикл внутри тела удобнее с помощью исключений.
 (nil try (list	for … (nil throw 'break) … ) break last-task)
 (list	assoc who	[testeql]) - возвращает пару (obj . obj-value) из списка ((a . 1) (b . 2) … (c . 3))  при которой who=obj если эта пара там существует, и nil - при отсутствии значения. При поиске используются предикаты равенства объектов testeql, по умолчанию: =
- 
(list	rassoc who	[testeql]) - возвращает пару (obj . obj-value) из списка ((a . 1) (b . 2) … (c . 3))  при которой who=obj-value если эта пара там существует, и nil - при отсутствии значения. При поиске используются предикаты равенства объектов testeql, по умолчанию: =
- 
('((1 . a) (2 . b) (3 . c))	rassoc 'c) → (3 . c)
(nil acons x y a-list)=(nil	cons	(nil	cons	x y) a-list) – добавляет в ассоциативный список пару (x . y), результат надо сохранять: ('a-list	set (nil	acons x y a-list))
- 
(а-список	pairlist ключи-список данные-список) – возвращает ассоциативный список из списка ключей и списка данных, а также добавляет старый а-список.
- 
('((a . 1))	pairlist '(b c) '(2 3)) → ((b . 2) (c . 3) (a . 1))
(list	= list … list) - сравнения содержания всех списков
(list	<> l1 … ln) - ни один список li не равен list.
- 
(list	contain item	[test]) – находится ли item в списке. По умолчанию test равен =. Возвращается элемент списка или false.
- 
('(a b c d)	contain 'c) → (c d)
(list	vector) - возвращает новый вектор с элементами списка
(nil	vector) - возвращает новый пустой вектор #()
- 
(list map fn [{list}]) - применение функции fn к элементам list и элементам [{list}]. Значением переменной fn может быть имя или лямбда список. Возвращается список результатов. Вычисления производятся параллельно. 
- 
('(1 2 3 4) map  '- '(1 1 1 1)) → (0 1 2 3)
 ('(1 2 3 4) map '-) → (-1 -2 -3 -4)
 ('(1 2.3 x "4") map '(lambda	()	(nil numberp this))) → (1 2.3 false false)
- 
(list mapc fn [{list}]) - применение функции fn к элементам list и элементам [{list}]. Значением переменной fn может быть имя или лямбда список. Не возвращает значение. Используется для получения побочного эффекта. Вычисления производятся параллельно. 
(list count [{x}]) - количество элементов списка удовлетворяющих запросу (elt = [{x}]).
(list count-if fn [{x}]) - количество элементов списка удовлетворяющих запросу (elt fn [{x}]).
- 
(list find [{x}]) - возвращается списочная ячейка, содержащая элемент удовлетворяющий условию (elt = [{x}]).
- 
('(1 2 3) find 2) → (2 3)
 ('(1 2 3) find 4) → nil
- 
(list find-if fn [{x}]) - возвращается списочная ячейка, содержащая элемент удовлетворяющий условию (elt fn [{x}]).
- 
('(1 2 3) find-if 'evenp) → (2 3)
 ('(1 2 3) find-if '> 10) → nil
- 
(list nsubstitute old new) - заменяет элементы списка удовлетворяющие условию (elt = old) на новое значение new.
- 
(list nsubstitute-if fn new) - заменяет элементы списка удовлетворяющие условию (elt fn) на новое значение new.
- 
(tree  nsubst [{old new}]) - заменяет элементы дерева, удовлетворяющие условию (elt = old) на новое значение new. Ветви дерева обрабатываются параллельно, набор правил последовательно.
- 
('(x 2 (y x (4 6 7 . x) x 6) 8 9) nsubst  'x  'www  'y  -7 'www  '(x)) →  
 ((x) 2 (-7 (x) (4 6 7 x) (x) 6) 8 9)
Сбалансированное бинарное дерево
- 
('btree newobject method-less) - новое пустое дерево с аргументом: функция "меньше". Удобнее передавать лямбда функцию.
- 
('btree  newobject '(lambda  (x)  (this  < x)))
(btree btree method-less) - опустошает дерево, меняет функцию "меньше".
- 
(btree insert x) - добавляет элемент в дерево. При обнаружении присутствия "равного" элемента - меняет его. Возвращает количество вставленных новых элементов: 1 или 0. Скорость O(log(size)).
- 
(btree-target insert btree-source) - добавляет все элементы в дерево. При обнаружении присутствия "равного" элемента - меняет его. Возвращает количество вставленных новых элементов. Скорость O(n*log(size)).
- 
(btree erase x) - изымает элемент из дерева. Возвращает количество удалённых элементов: 1 или 0. Скорость O(log(size)).
- 
(btree erase btree-node) - изымает предоставленный элемент дерева. Возвращает количество удалённых элементов: 1. Скорость O(log(size)). Если дерево не содержит данный элемент, эффект не определён.
(btree find content) - поиск элемента. Возвращает элемент дерева или nil. Скорость O(log(size)).
(btree method-less) - возвращает функцию порядка дерева.
(btree clear) - опустошает дерево. Скорость O(1).
(btree size) - возвращает количество элементов в дереве. Скорость O(1).
(btree empty) - предикат пустого дерева. Скорость O(1).
(btree copy) - возвращает новое дерево с идентичным содержимым. Скорость O(size).
(btree-target set btree-source) - устанавливает копию дерева, с заменой функции сортировки. Скорость O(size).
(btree swap btree) - полный обмен содержимым. Скорость O(1).
(btree list) - возвращает новый список элементов дерева. Скорость O(size).
(btree vector) - возвращает новый вектор элементов дерева. Скорость O(size).
(btree begin) - возвращает элемент дерева с "минимальным" содержимым. Скорость O(log(size)).
(btree end) - возвращает элемент дерева с "максимальным" содержимым. Скорость O(log(size)).
(btree root) - возвращает элемент дерева со "средним" содержимым. Корень дерева. Скорость O(1).
  Дерево состоит из элементов. Пользоваться ими можно для просмотра содержимого, перехода в другие узлы.
(btree-node content) - возвращает содержимое в данном узле. Скорость O(1).
(btree-node next) - возвращает следующий узел с элементом, который "больше", или nil. Скорость O(log(size)).
(btree-node prev) - возвращает предыдущий узел с элементом, который "меньше", или nil. Скорость O(log(size)).
(btree-node left) - возвращает узел, где все элементы поддерева меньше элемента данного узла. Может возвратить nil. Скорость O(1).
(btree-node right) - возвращает узел, где все элементы поддерева больше элемента данного узла. Может возвратить nil. Скорость O(1).
(btree-node back) - возвращает узел, который ведёт к корню дерева. Может возвратить nil, если данный узел это корень. Скорость O(1).
('btree-node newobject father content left right balance)
(btree-node btree-node father content left right balance)
(btree-node insert content method-less)
(btree-node erase content|btree-node method-less)
(btree-node find content method-less)
(btree-node copy)
(btree-node begin)
(btree-node end)
(btree-node list nprocs)
(btree-node vector vector index)
Вектор
 (vector	elt [i [j … [k]]]) - возвращает элемент вектора vectori,j,…,k. Элементы вектора нумеруются от 0 до size-1.
- 
 (vector	size) - возвращает длину вектора vector
- 
(#()	size)→0
 (#(1)	size)→1
 
- 
(vector	resize size [new]) – подправляет длину вектора размером size, если нужно добавить размер, дополнительные элементы инициализируются new.
 
- 
(vector	clear)=(vector	resize 0)
- 
(vector	setelt i j … k new) – устанавливает новое значение по индексам i,j,…,k на new. Возвращает подправленный vector.
- 
(#(1 #(2 3) 4)	setelt 1 1 'new) → #(1 #(2 new) 4)
- 
(vector	reverse) – создаёт новый вектор с обращением порядка элементов
- 
(#(1 2 3)	reverse) → #(3 2 1)
- 
('vector newobject dimlist [init]) - создаёт вектор размерности dimlist1×dimlist2×…×dimlistn с элементами init.
- 
('vector	newobject	'(2 2) 0) → #(#(0 0) #(0 0))
- 
('vector newobject number [init]) - создаёт одномерный вектор размерности number с элементами init.
- 
('vector	newobject	2 0) → #(0 0)
- 
('vector newobject another-vector)=(another-vector	copy)
 ('vector newobject another-vector integer-index-start)=(another-vector subseq integer-index-start)
 ('vector newobject another-vector integer-index-start integer-index-end)=(another-vector subseq integer-index-start integer-index-end)
 ('vector newobject) → #()
- 
(vector merge {vector}) - возвращает объединение векторов vector. Все вектора не разрушаются 
- 
(#(1 2) merge #() #(3 4)) → #(1 2 3 4)
 
- 
(vector  subseq [a [e]]) - При отсутствии аргументов возвращается копия вектора. Возвращает новый вектор с элементами по индексам начиная с a-го. Параметр e - задаёт индекс, начиная с которого данные не копируются.
- 
(#(1 2 3 4) subseq 1) → #(2 3 4)
 (#(1 2 3 4) subseq 1 2) → #(2)
- 
(vector	push item) – item добавляется в вектор vector, возвращается vector.
 (vector	push item index) – item добавляется по индексу index, возвращается vector
- 
('x	set #(1 2))(x	push 3)→#(1 2 3)
 x=#(1 2 3)
 ('x	set #(1 2 3))(x	push 7 1)→#(1 7 2 3)
 x=#(1 7 2 3)
 
- 
(vector	pop [index]) - извлекает из вектора последний элемент и возвращает его. Если предоставлен индекс, то извлекается элемент по данному индексу.
 
- 
('y	set #(1))
 (y	push 2) → #(1 2)
 (y	pop) → 2
 y → #(1)
- 
(vector	contain item	[test]) – находится ли item в векторе. По умолчанию test равен =. Возвращается индекс найденного элемента или false.
- 
(#(a	b	c	d)	contain 'c) → 2
 (#(a	b	c	d)	contain 'e) → false
- 
(vector	for* symbol	{body}) – пошагово локальной переменной symbol присваиваются элементы вектора vector, вычисляются пошагово формы body. Возвращается последний результат формы body.
- 
(#(1	2	3)	for* i	(cout	writeln "i=" i "..")) → 
 i=1..
 i=2..
 i=3..
 Остановить цикл внутри тела удобнее с помощью исключений.
 (nil try (vector	for* … (nil throw 'break) … ) break last-task)
- 
(vector	for symbol	{body}) – параллельно локальным переменным symbol (для каждого процесса своя переменная symbol) присваиваются элементы вектора vector, при каждом значении вычисляются пошагово формы body. 
- 
(#(1 2 3)	for i (cout	write " i+1=" (i	+	1)) (i	+	1)) → 
 i+1=3 i+1=2 i+1=4
 → nil
 Остановить цикл внутри тела удобнее с помощью исключений.
 (nil try (vector	for … (nil throw 'break) … ) break last-task)
(vector	copy)	-	возвращает новый вектор.
(vector	copy-matrix)	-	возвращает новый вектор. Если элемент - вектор, то он также копируется.
- 
(vectorthis setf vectorarg)	- полная замена элементов вектора на новые, предоставленные vectorarg.
(vector vector dimlist [init])≈(vector setf ('vector	newobject dimlist  [init]))
(vector vector number [init])≈(vector setf ('vector	newobject number [init]))
(vector vector another-vector)=(vector setf another-vector)
- 
(vector vector another-vector integer-index-start) - даёт значения начиная со стартовой позиции.
- 
(#()	vector	#(1 2 3) 1) → #(2 3)
- 
(vector vector another-vector integer-index-start integer-size) - даёт значения начиная со стартовой позиции, с определённым размером вектора.
- 
(#()	vector	#(1 2 3) 1 2) → #(2)
- 
(matrix	transpose)	-	возвращает новую матрицу с переставленными элементами
- 
(#(#(1 2) #(3 4))	transpose)	→	#(#(1 3) #(2 4))
- 
(vector	+ {vector})	-	сложение векторов чисел, матриц и других объектов, у которых существует метод +.
- 
(#(1 2) + #(3 -4))	→	#(4	-2)
 (#(#(1	2) #(3	4)) + #(#(1	0) #(0	-1)))	→	#(#(2	2)	#(3	3))
- 
(vector	- {vector})	-	вычитание векторов чисел, матриц и других объектов, у которых существует метод -. Возвращает новый вектор.
- 
(#(1 2) - #(3 -4))	→	#(-2	6)
 (#(1 2) -)	→	#(-1	-2)
 (#(#(1	2) #(3	4)) - #(#(1	0) #(0	-1)))	→	#(#(0	2)	#(3	5))
 
- 
(vector	*	number	… )	-	умножение	элементов вектора на	число	number, возвращает новый вектор.
 (vector	*	vector)	-	скалярное произведение.
- 
(#(1 -2)	*	2	-3)	→	#(-6	12)
 (#(1 2)	*	#(-2	1))	→	0
  Вектор векторов подразумевает матрицу. Матрица задаётся построчно. Первый элемент вектора это первая строка матрицы, второй - вторая, и т.д. Операции +, -, * задаются в математическом смысле.
| R=M+N | Ri,j=Mi,j+Ni,j | 
| R=M-N | Ri,j=Mi,j-Ni,j | 
| R=m*N | Ri,j=m*Ni,j | 
- 
(vector	remove	elt) – удаляет из вектора элементы удовлетворяющие равенству (elt = vectori),  возвращает новый вектор без данных элементов
- 
(#(1 2 3)	remove 2)	→	#(1 3)
- 
(vector = v1 … vn) – равенство vector=v1=…=vn
- 
У элементов вектора должен быть метод <>.
- 
(vector <> obj1 … objn) - ни один аргумент obji не равен vector.
- 
У элементов вектора должен быть метод <>.
- 
(vector	list)	-	возвращает новый список элементов вектора
- 
(#(1 2) list) → (1 2)
- 
(vector	empty)	-	предикат пустого вектора
- 
(#(1 2) empty) → false
 (#() empty) → #()
- 
(vector	insert integer-place x)	-	вставляет x на место integer-place.
- 
(#(1 2) insert	1	7) → #(1 7 2)
- 
(vector += [{vector}])≈(vector setf (vector + [{vector}]))
- 
(vector -= [{vector}])≈(vector setf (vector - [{vector}]))
- 
(vector *= [{number}])≈(vector setf (vector * [{number}]))
- 
(vector swap integer-index integer-index) - меняет местами элементы вектора. Возвращает вектор.
 (vector swap vector) - меняет состав векторов. Смена проводится очень быстро.
- 
('v set #(1 2 3)) → #(1 2 3)
 ('w set #(a b)) → #(a b)
 (v swap w) → #(a b)
 v → #(a b)
 w → #(1 2 3)
- 
(vector first)=(vector elt 0)
- 
(vector last)=(vector elt ((vector size) - 1))
- 
(vector map fn [{vector}]) - применение функции fn к элементам vector и элементам [{vector}]. Значением переменной fn может быть имя или лямбда список. Возвращается вектор результатов. Вычисления производятся параллельно. 
- 
(#(1 2 3 4) map  '- #(1 1 1 1)) → #(0 1 2 3)
 (#(1 2 3 4) map '-) → #(-1 -2 -3 -4)
 (#(1 2.3 x "4") map '(lambda	()	(nil numberp this))) → #(1 2.3 false false)
- 
(vector mapc fn [{vector}]) - применение функции fn к элементам vector и элементам [{vector}]. Значением переменной fn может быть имя или лямбда список. Не возвращает значение. Используется для получения побочного эффекта. Вычисления производятся параллельно. 
(vector count [{x}]) - количество элементов вектора удовлетворяющих запросу (elt = [{x}]).
(vector count-if fn [{x}]) - количество элементов вектора удовлетворяющих запросу (elt fn [{x}]).
- 
(vector find [{x}]) - возвращается индекс элемента вектора удовлетворяющий условию (elt = [{x}]).
- 
(#(1 2 3) find 2) → 1
 (#(1 2 3) find 4) → nil
- 
(vector find-if fn [{x}]) - возвращается индекс элемента вектора удовлетворяющий условию (elt fn [{x}]).
- 
(#(1 2 3) find-if 'evenp) → 1
 (#(1 2 3) find-if '> 10) → nil
- 
(vector nsubstitute old new) - заменяет элементы вектора удовлетворяющие условию (elt = old) на новое значение new.
- 
(vector nsubstitute-if fn new) - заменяет элементы вектора удовлетворяющие условию (elt fn) на новое значение new.
- 
(vector sort) - сортировка элементов вектора (метод порядка <).
- 
(#(1 2 3 4 3 2 1) sort) → #(1 1 2 2 3 3 4)
Байт-вектор
- 
('byte-vector newobject size [init]) - создаёт байт-вектор размера size с элементами init.
- 
('byte-vector  newobject 2 1) → #[1 1]
 ('byte-vector  newobject 2) → #[0 0]
- 
('byte-vector newobject another-byte-vector)=(another-byte-vector  copy)
 ('byte-vector newobject another-byte-vector integer-index-start)=(another-byte-vector subseq integer-index-start)
 ('byte-vector newobject another-byte-vector integer-index-start integer-index-end)=(another-byte-vector subseq integer-index-start integer-index-end)
 ('byte-vector newobject) → #[]
(byte-vector byte-vector size [initvalue])=(byte-vector resize size [initvalue])
(byte-vector byte-vector size)=(byte-vector resize size 0)
(byte-vector byte-vector another-byte-vector)=(byte-vector setf another-byte-vector)
- 
(byte-vector byte-vector another-byte-vector integer-index-start) - даёт значения начиная со стартовой позиции.
- 
(#[]  byte-vector  #[1 2 3] 1) → #[2 3]
- 
(byte-vector byte-vector another-byte-vector integer-index-start integer-size) - даёт значения начиная со стартовой позиции, с определённым размером вектора.
- 
(#[]  byte-vector  #[1 2 3] 1 2) → #[2]
(byte-vector  copy)  - возвращает новую копию байт-вектора.
(byte-vector setf another-byte-vector) - полное изменение размера и данных
- 
(byte-vector swap integer-index integer-index) - меняет местами элементы вектора. Возвращает вектор.
 (byte-vector swap byte-vector) - меняет состав векторов. Смена проводится очень быстро.
- 
('v set #[1 2 3]) → #[1 2 3]
 ('w set #[127 128]) → #[127 128]
 (v swap w) → #[127 128]
 v → #[127 128]
 w → #[1 2 3]
- 
 (byte-vector size) - возвращает длину вектора.
- 
(#[]  size)→0
 (#[1] size)→1
 
 (byte-vector elt i [number-result-place]) - возвращает элемент вектора byte-vectori. Элементы вектора нумеруются от 0 до size-1. При присутствии аргумента number-result-place новое число не создаётся: (byv elt ind num)≈(num setf (byv elt ind)).
- 
(byte-vector  setelt [i [new]]) – устанавливает новое значение по индексу i на new. Возвращает подправленный byte-vector. Если аргумент new не указан - устанавливается 0.
- 
(#[1 2 3]  setelt 1 127) → #[1 127 3]
- 
(byte-vector  resize [size [new]]) – подправляет длину вектора размером size, если нужно добавить размер, дополнительные элементы инициализируются new. По умолчанию новые элементы будут иметь значение 0.
 
- 
(byte-vector  push-back [new]) – добавляется новое значение в конец вектора. Возвращает подправленный byte-vector. Если аргумент new не указан - добавляется 0.
- 
(#[1 2 3]  push-back 127) → #[1 2 3 127]
- 
(byte-vector  push-front [new]) – добавляется новое значение в начало вектора. Возвращает подправленный byte-vector. Если аргумент new не указан - добавляется 0.
- 
(#[1 2 3]  push-front 127) → #[127 1 2 3]
- 
(byte-vector  pop-back [number-result]) – извлекает значение из конца вектора и возвращает это значение. При наличии аргумента number-result новое число не создаётся: (vec pop-back num)≈(num setf (vec pop-back)). При пустом векторе возвращается nil.
- 
('v set #[1 2 3]) → #[1 2 3]
 (v  pop-back) → 3
 v → #[1 2]
- 
(byte-vector  pop-front [number-result]) – извлекает значение из начала вектора и возвращает это значение. При наличии аргумента number-result новое число не создаётся: (vec pop-front num)≈(num setf (vec pop-front)). При пустом векторе возвращается nil.
- 
('v set #[1 2 3]) → #[1 2 3]
 (v  pop-front) → 1
 v → #[2 3]
- 
(byte-vector  clear)=(byte-vector  resize 0)
- 
(byte-vector  empty) - предикат пустого вектора.
- 
(#[1 2] empty) → nil
 (#[] empty) → #[]
- 
(byte-vector  back [number-result]) – значение в конце вектора. При наличии аргумента number-result новое число не создаётся: (vec back num)≈(num setf (vec back)). При пустом векторе возвращается nil.
- 
(#[1 2 3]  back) → 3
- 
(byte-vector  front [number-result]) – значение в начале вектора. При наличии аргумента number-result новое число не создаётся: (vec front num)≈(num setf (vec front)). При пустом векторе возвращается nil.
- 
(#[1 2 3]  front) → 1
- 
(byte-vector  vector [vector-result]) – возвращает новый вектор из чисел элементов byte-vector. При присутствии аргумета vector-result числа устанавливаются туда.
- 
(#[1 2 3]  vector) → #(1 2 3)
 ('v set #(7 7 7 7)) → #(7 7 7 7)
 (#[1 2 3]  vector v) → #(1 2 3)
 v → #(1 2 3)
- 
(byte-vector  string [string-result]) – возвращает новую строку из символов, задаваемых с помощью чисел элементов byte-vector как код. При присутствии аргумета string-result символы устанавливаются туда.
- 
(#[49 50 51]  string) → "123"
 ('s set "abcd") → "abcd"
 (#[49 50 51]  string s) → "123"
 s → "123"
- 
(byte-vector  list) – возвращает список из чисел byte-vector.
- 
(#[]  list) → nil
 (#[1 2 3]  list) → (1 2 3)
- 
(byte-vector  subseq [a [e]]) - При отсутствии аргументов возвращается копия вектора. Возвращает новый вектор с элементами по индексам начиная с a-го. Параметр e - задаёт индекс, начиная с которого данные не копируются.
- 
(#[1 2 3 4] subseq 1) → #[2 3 4]
 (#[1 2 3 4] subseq 1 2) → #[2]
- 
(byte-vector	contain item	[test]) – находится ли item в векторе. По умолчанию test равен =. Возвращается индекс найденного элемента или false.
- 
(#[10	11	12	13]	contain '12) → 2
 (#[10	11	12	13]	contain '14) → false
Строки
(str	size) - возвращает длину строки
('string newobject size [char]) - создаёт строку размера size. Заполняется буквами char, по умолчанию пробелами.
('string newobject another-string)=(another-string	copy)
('string newobject another-string integer-index-start)=(another-string subseq integer-index-start)
('string newobject another-string integer-index-start integer-index-end)=(another-string subseq integer-index-start integer-index-end)
('string newobject) → ""
- 
(str1 + {strn|char}) - возвращает объединение строк str… Все строки не разрушаются 
- 
('x	set "Year")("New" + " " x #\!) → "New Year!"
(str0 = str1 … strn) – равенство str0=str1=…=strn
- 
(str <> st1 … stk) - ни одна строка sti не равна str
- 
(nil  not (str <> st1 … stk)) - строка равна одному из аргументов.
(str0	<	str1 … strn), (str0	>	str1 … strn), (str0	<=	str1 … strn), (str0	>=	str1 … strn) – по коду букв (словарному порядку).
(str	min str … str), (str	max str … str) – минимальная/максимальная
- 
(obj	string) -– создаёт строку, которая представляет собой строковое представление объекта obj.
Поддерживается преобразование типов: nil, boolean, char, number,	symbol, byte-vector.
- 
(('(1)	rest)	string) → "NIL"
 ('abcd	string) → "abcd"
- 
(str	elt ind) – буква на месте ind.
- 
Если ind превышает размер строки возвращается nil.
- 
(str	setelt ind newchar) – ставит другую букву newchar на месте ind. Возвращает подправленную строку str.
- 
Если ind превышает размер строки, то строка увеличивает свой размер с добавлением пробелов.
- 
(string  subseq [a [e]]) - При отсутствии аргументов возвращается копия строки. Возвращает новая строка с элементами по индексам начиная с a-го. Параметр e - задаёт индекс, начиная с которого данные не копируются.
- 
("abcd" subseq 1) → "bcd"
 ("abcd" subseq 1 2) → "b"
(str	lower) – возвращает новую строку с буквами в нижнем регистре
(str	upper) – возвращает новую строку с буквами в верхнем регистре
 (str	read) - конвертирует строку в объект Лиспа (встроенный синтаксический анализатор)
- 
(string	for* symbol	{body}) – пошагово локальной переменной symbol присваиваются элементы строки string, вычисляются пошагово формы body. Возвращается последний результат формы body.
- 
("(1 2 3)"	for* i	(cout	writeln "i=" i "..")) → 
 i=(..
 i=1..
 i= ..
 i=2..
 i= ..
 i=3..
 i=)..
 Остановить цикл внутри тела удобнее с помощью исключений.
 (nil try (string	for* … (nil throw 'break) … ) break last-task)
- 
(string	for symbol	{body}) – параллельно локальным переменным symbol (для каждого процесса своя переменная symbol) присваиваются элементы строки string, при каждом значении вычисляются пошагово формы body. 
- 
("abc"	for i (cout	write " number(i)=" (i	number)) (i	number)) → 
 number(i)=99 number(i)=98 number(i)=97
 → nil
 Остановить цикл внутри тела удобнее с помощью исключений.
 (nil try (string	for … (nil throw 'break) … ) break last-task)
- 
(string	contain char	[test]) – находится ли char в строке. По умолчанию test равен =
- 
("abcd"	contain #\c) → 2
 ("abcd"	contain #\e) → false
- 
(string	list) – возвращает список букв.
- 
("Abcd"	list) → (#\A #\b #\c #\d)
- 
(string	vector) – возвращает вектор букв.
- 
("Abcd"	vector) → #(#\A #\b #\c #\d)
- 
(string  byte-vector) – возвращает байт-вектор кодирования строки в UTF-8.
- 
- 
(string	remove	elt) – удаляет из строки элементы удовлетворяющие равенству (elt = stringi),  возвращает новую строку без данных элементов
- 
("ABBA"	remove #\B)	→	"AA"
(string copy) - возвращает новую строку.
- 
(string	setf string) - физически заменяет строку новым значением. Использование данной операции чревато ошибками программирования.
- 
('x	set	"abc") → "abc"
 ('y	set	(nil	list	x x x)) → ("abc" "abc" "abc")
 (x setf (x upper)) → "ABC"
 y → ("ABC" "ABC" "ABC")
 Для избежания порчи работающей программы следует пользоваться функцией копирования:
 (nil let ((x "")) … → (nil let ((x ("" copy))) …
 ('x set "abc") → (x setf "abc")
 (nil	setq	x "abc") → (x setf "abc")
(string  swap string) - физически обменивается значения.
(string string number [char])≈(string setf ('string newobject number  [char]))
(string string another-string)=(string setf another-string)
(string string another-string integer-index-start)=(another-string subseq integer-index-start)
(string string another-string integer-index-start integer-index-end)=(another-string subseq integer-index-start integer-index-end)
- 
(string resize  newsize [char]) - изменяет размер строки на newsize. Новые буквы определяются с помощью char. По умолчанию пробелами.
- 
(string += [{char|string}])≈(string setf (string + [{char|string}]))
- 
(string nsubstitute index size char|string) - заменяет участок строки начиная с index по index+size-1 на новую строку или букву.
- 
("aha" nsubstitute 1 1 "bb") → "abba"
- 
(string nsubstitute char char) - заменяет буквы на новые.
- 
("aha" nsubstitute #\a #\A) → "AhA"
- 
(string nsubstitute-if method char) - заменяет буквы удовлетворяющие результату работы метода method на новое значение char.
- 
("10x15" nsubstitute-if '(lambda  ()  (nil not (this digitp))) #\space) → "10 15"
(string count [{x}]) - количество элементов строки удовлетворяющих запросу (elt = [{x}]).
(string count-if fn [{x}]) - количество элементов строки удовлетворяющих запросу (elt fn [{x}]).
- 
(string find [{x}]) - возвращается индекс элемента строки удовлетворяющий условию (elt = [{x}]).
- 
("abcE" find #\E) → 3
 ("abcE" find #\e) → nil
- 
(string find-if fn [{x}]) - возвращается индекс элемента строки удовлетворяющий условию (elt fn [{x}]).
- 
("abcE" find-if 'upperp) → 3
 ("abcE" find-if 'digitp) → nil
Буквы
(char0 = char1 … charn) – равенство char0=char1=…=charn
- 
(char <> char1 … charn) – ни один chari не равен char
- 
(nil not ( char <> char1 … charn) - один из аргументов равен объекту 
(char0 <= [char1 … charn]) – char0≤char1≤…≤charn
(char0 < [char1 … charn]) – char0<char1<…<charn
(char0 > [char1 … charn]) – char0>char1>…>charn
(char0 >= [char1 … charn]) – char0≥char1≥…≥charn
(char	min	char	…	char), (char	max	char	…	char) – минимальный/максимальный
 (number	char) - возвращает букву с кодом number UTF-16
 (ch	number) - возвращает код буквы ch UTF-16
 (ch	byte-vector) - возвращает байт-вектор UTF-8.
 (byte-vector	char) - возвращает первую букву из byte-vector UTF-8
 (ch	alphap) - буква в верхнем или нижнем регистре #\a…#\z #\A…#\Z
 (ch	upperp) - буква в верхнем регистре #\A…#\Z
 (ch	lowerp) - буква в нижнем регистре #\a…#\z
 (ch	digitp) - #\0…#\9
 (ch	spacep) - символ-разделитель
 (ch	controlp) - управляющий символ (ASCII 0…31 или 127)
 (ch	printp) - можно ли распечатать
 (ch	upper) - эквивалент буквы в верхнем регистре
 (ch	lower) - эквивалент буквы в нижнем регистре
- 
(charthis	setf	chararg)=(charthis char [chararg]) - изменяет значение буквы на новое, предоставленные chararg. Использование данной операции чревато ошибками программирования.
- 
(charthis  swap chararg) - меняет значения букв. Использование данной операции чревато ошибками программирования.
- 
(char	copy) - возвращает новую букву.
- 
('char newobject char)
 ('char newobject) - не определённая.
Замки и сигналы
  Используется для монопольного доступа к важным участкам программы.
('lock newobject) - создаёт замок.
(lock progn {body})=(nil  progn (lock set) {body} (lock unlock)) - устанавливается замок и пошагово вычисляет задачи body. После выполнения всех задач замок освобождается. Если замок был закрыт, то ожидается его открытие.
(lock try task-locked task-free) - при успешной установке замка вычисляется задача task-locked, иначе task-free.
(lock set) - устанавливается замок. Если замок был закрыт, то ожидается его открытие. 
(lock unlock) - открытие замка. Если замок был открыт, вызоветься исключение. 
('signal newobject) - создаёт объект сигнал.
- 
(signal wait [lock]) - ожидает сигнал. Если предоставлен замок, то он отключается и при получении сигнала устанавливается.
- 
(lock progn
 …
 (signal wait lock)
 …)
(signal send) - посылает сигнал.
Объектно-ориентированное программирование
  Создана эта техника программирования для-того чтобы люди смогли физически понять очень большую программу. И объектом называется часть кода, у которого есть несколько функций общения с другой частью программы. 
  Все встроенные типы имеют свой класс, можно узнать его имя с помощью функции (nil	type-of obj).
(имя-класса	defclass) – минимальное пока ещё пустое определение. Возвращается имя класса.
- 
 (имя-класса	defclass	pclass1 … pclassn) - определение класса с родительскими классами pclass1…pclassn
- 
Перегрузка методов/статических переменных происходит слева направо:
 методы из pclassn перегружают pclassn-1 ,… методы данного класса перегружают все остальные.
- 
(имя-класса	defvar	[{varname}]) - добавляет поля к классу. Символы varname не вычисляются. Возвращается имя класса.
- 
Внешнего доступа до переменных объекта нет. Можно только с помощью методов.
(имя-класса	defstatic	varname startvalue) - добавляет/изменяет статическое поле класса. Все аргументы вычисляются.
- 
 (имя-класса	defmethod methodname (… args …) {methodbody}) - добавляет методы к классу. С именами : methodname и имя-класса::methodname .  Задачи methodbody будут вычислятся пошагово. 
 
- 
В отличие от большинства языков, возможно динамическое изменение методов в процессе работы программы - и все существующие объекты будут соответственно менять своё "поведение".
 (имя-класса	defmacro macroname (… args …) {macrobody}) - добавляет макросы к классу. С именами : macroname и имя-класса::macroname . 
- 
  Определить закрытую функцию для работы внутри объекта можно с помощью статических переменных, определённых как ламбда список.
- 
('className	defstatic	'functionName	'(lambda	(	…	arguments	…	)	function-body))
- 
  Чтобы запустить такую функцию нужно использовать funcall:
- 
(nil	funcall	this	functionName	…	arguments	…	)
(имя-класса	getmethod	methodname) - возвращает определение метода. methodname вычисляется. Если такого метода нет, то nil.
(имя-класса	getclass) - возвращает определение класса. Если такого класса нет, то nil.
 Использование:
(obj) → obj
(obj method arg1 … argn) - вызов метода method объекта obj.
Основываясь на типе объекта.
(obj имя-класса::method arg1 … argn) - статически. Вызов метода базового имя-класса.
- 
(имя-класса	newobject	{args}) - создаёт новый объект данного класса.
- 
Если был создан метод с именем класса запускается этот конструктор с аргументами {args}.
(object copy) - возвращает новый объект.
- 
(nil private [object [{tasks}]]) - выполнить задачи внутри объекта с полным доступом к связям переменных. Данную функцию можно вызывать только внутри метода данного класса.
- 
('cl defclass)
 ('cl defvar v)
 ('cl defmethod cl (x)
 (nil  setq  v x))
 ('cl defmethod v () v)
 ('cl defmethod move (x)
 (nil setq v
 (nil private x
 (nil let ((vold v))
 (nil setq v nil)
 vold))))
 (nil setq a ('cl newobject 1) b ('cl newobject 2))
 (a v)→1
 (b v)→2
 (a move b)
 (a v)→2
 (b v)→nil
 
Работа с потоками ввода/вывода
  Есть три стандартных потока, которые используются функциями по умолчанию. Они хранятся в переменных cin, cout и cerr.
 (stream	write obj … obj) - выводит значения obj в удобном для просмотра человека виде. Возвращается поток.
 (stream	princ obj … obj) - выводит значения obj в виде, пригодном для ввода в интерпретатор. Возвращается поток.
 (stream	writeln obj … obj) - вызывает функцию write и делает перевод строки. Возвращается поток.
 (stream	print obj … obj) - вызывает функцию princ и делает перевод строки. Возвращается поток.
 - 
 (string	open  [{mode}]) - открывает файл с именем string и возвращает связанный с ним поток. Режим потока задаётся с помощью символов mode. По умолчанию считается на чтение и запись.
 
- 
  
   - Режим	mode может задаваться символами:
   
- 
    
     | in | на чтение |  | out | на запись |  | in-out | на чтение и запись |  | trunc | урезать файл до нулевой длины |  | app | (append) добавление в конец (и только) |  | ate | (at end) открытие и поиск конца файла (можно двигаться назад) |  | async | включает ввод-вывод, управляемый сигналом |  | cloexec | устанавливает флаг close-on-exec на новом файловом дескрипторе |  | direct | Файловый ввод-вывод выполняется непосредственно в/из буферов пространства пользователя. |  | directory | Если строка не является каталогом, то завершить вызов с ошибкой. |  | dsync | Операции записи файла будут выполнены согласно требованиям целостности синхронизации ввода-вывода, но обновляются только те метаданные, которые требуются для выполнения последующего чтения. |  | sync | Операции записи файла будут выполнены согласно требованиям целостности синхронизации ввода-вывода. |  | excl | Гарантирует, что вызов создаст файл: если этот флаг указан вместе с create а файл уже существует, то open завершится с ошибкой. |  | largefile | (LFS) Позволяет открывать файлы, чей размер нельзя представить 32 битным типом. |  | noatime | Не обновлять время последнего доступа к файлу (st_atime в inode) при его чтении. |  | noctty | Если строка указывает на терминальное устройство, то оно не станет управляющим терминалом процесса, даже если процесс такового не имеет. |  | nofollow | Если строка является символьной ссылкой, то открытие завершится неудачно. |  | nonblock или ndelay | Если возможно, файл открывается в неблокирующем режиме. |  | path | Получить файловый дескриптор, который можно использовать для двух целей: для указания положения в дереве файловой системы и для выполнения операций, работающих исключительно на уровне файловых дескрипторов. |  | create | если файл не существует, то он будет создан ( out и trunc ) |  | tmpfile | Создание безымянного временного файла. В строке указывается каталог; безымянная inode будет создана в файловой системе этого каталога. |  
 
- Для режимов create и tmpfile нужно устанавливать права для будущего доступа к файлу.
   
- 
    
     | rwxusr | 00700 пользователь (владелец файла) имеет права на чтение, запись и выполнение файла |  | rusr | 00400 пользователь имеет права на чтение файла |  | wusr | 00200 пользователь имеет права на запись в файл |  | xusr | 00100 пользователь имеет права на выполнение файла |  | rwxgrp | 00070 группа имеет права на чтение, запись и выполнение файла |  | rgrp | 00040 группа имеет права на чтение файла |  | wgrp | 00020 группа имеет права на запись в файл |  | xgrp | 00010 группа имеет права на выполнение файла |  | rwxoth | 00007 все остальные имеют права на чтение, запись и выполнение файла |  | roth | 00004 все остальные имеют права на чтение файла |  | woth | 00002 все остальные имеют права на запись в файл |  | xoth | 00001 все остальные имеют права на выполнение файла |  | suid | 04000 set-user-ID бит (при запуске имеет права владельца) |  | sgid | 02000 set-group-ID бит (при запуске имеет права группы владельца) (В директории все новые файлы получают группу данной директории) |  | svtx | 01000 закрепляющий бит (в данной директории удалить файл может только владелец данного файла) |  
 
 
(string	create)=(string	open	'out	'trunc) - создаёт новый пустой файл с именем string и возвращает связанный с ним поток для записи.
 (stream	close) - закрывает поток. Возвращает nil при успехе или один из символов  badf, intr, io при ошибке.
 (stream	read) - читает из потока строковое представление объекта и возвращает объект Lisp2D.
- 
(stream	read-line [string]) - читает строку символов из потока и возвращает строку без символа перевода строки. Если предоставлена строка string результат будет помещён туда. При нахождении конца файла возвращается nil.
- 
 (cin	read-line) - из консоли
(stream	read-char [char]) - читает 1 символ из потока. Если предоставлен char результат будет помещён туда. Возвращается символ или nil.
 (stream	read-byte [number]) - читает 1 байт из потока и возвращает целое число. Если предоставлено число number результат будет помещён туда. Возвращается число 0..255 или nil.
 (stream	listen) - возвращает true когда в потоке не обнаружен признак конца файла, иначе - false
 (stream	openp) - возвращает stream если поток открыт, иначе - false.
(stream	terpri) - пишет символ конца строки в поток stream
(stream	write-byte number|byte-vector) - пишет в поток 1 байт или byte-vector байт. Возвращается число записанных байт или символ ошибки (один из again, badf, destaddrreq, dquot, fault,
fbig, intr, inval, io, nospc, perm, pipe, wouldblock).
(stream	tell) - возвращает целое число - позицию чтения/записи потока
- 
(stream	seek	number [mode]) - устанавливает позицию записи/чтения в потоке. Возвращает число - позицию в потоке.
- 
- 
Первый байт имеет позицию 0, последний size-1
 
 Символ mode задаёт режим отсчёта позиции:
- 
| beg | от начала текущего файла |  | cur | от текущей позиции плюс число |  | end | от конца текущего файла плюс число |  | hole | первое попавшееся пустое место в файле после указанной позиции или конец |  | data | первое попавшееся заполненое данными место в файле |  
 
 
(stream	flush) - очищает буфер потока. Возвращает nil при успехе или символ io | rofs | inval | badf | fail | nobuf.
(string|stream	truncate size) - изменяет размер файла задаваемого с помощью имени string или потока stream. Возвращается символ ошибки (access, fault, fbig, intr, inval, io, isdir, loop, nametoolong, noent, notdir, perm, rofs, txtbsy, badf) или nil, если всё в порядке.
- 
(string|stream	chdir) - делает текущим заданный каталог. Возвращает nil или символ ошибки access, badf, fault, io, loop, nametoolong, noent, nomem, notdir.
- (string-filename|stream	change-owner-group [number-UID|nil [number-GID|nil]]) - устанавливает идентификатор владельца и группы файла (если предоставлена ссылка, то у адресата ссылки). При предоставлении nil владелец/группа не изменится. (У простого пользователя нет прав на это изменение). Возвращает nil или символ ошибки (access, fault, loop,
nametoolong, noent, nomem, notdir, perm, rofs, badf, io).
- 
("." change-owner-group 1000  100) → nil
 ("." change-owner-group nil  101) → perm
 ("." change-owner-group 1001) → perm
- (string-filename	lchange-owner-group [number-UID|nil [number-GID|nil]]) - устанавливает идентификатор владельца и группы самой ссылки (если это обычный файл то у файла). При предоставлении nil владелец/группа не изменится. (У простого пользователя нет прав на это изменение). Возвращает nil или символ ошибки (access, fault, loop,
nametoolong, noent, nomem, notdir, perm, rofs, badf, io).
Stat - статус файла
  Структура данных о файле. Берётся с помощью пути или потока.
- 
(stat stat [stat|string-path|stream]) - конструктор
 ('stat newobject) - новая пустая структура
 ('stat newobject stat) - новая копия
 ('stat newobject string-path)=(string-path stat)
 ('stat newobject stream)=(stream stat)
- 
(string-path stat [stat-place]) - возвращается статус файла по пути string-path. Если путь это ссылка, то возвращается статус файла на которого указывает ссылка. Если аргументом предоставлено stat-place, то результат прописывается в это место. При ошибке возвращается символ ( access , badf , fault , loop , nametoolong , noent , nomem , notdir , overflow ) .
(string-path lstat [stat-place]) - возвращается статус файла по пути string-path.  Если путь это ссылка, то возвращается статус именно самой ссылки. Если аргументом предоставлено stat-place, то результат прописывается в это место. При ошибке возвращается символ ( access , badf , fault , loop , nametoolong , noent , nomem , notdir , overflow ) .
(stream stat [stat-place]) - возвращается статус потока stream. Если аргументом предоставлено stat-place, то результат прописывается в это место.  При ошибке возвращается символ ( access , badf , fault , loop , nametoolong , noent , nomem , notdir , overflow ) .
(stat setf [statx]) - в структуру stat копируются данные statx. Возвращается сам объект.
(stat swap [statx]) - обмен данных структур stat и statx. Возвращается сам объект.
- (stat	device) - список чисел ( major minor ).
- 
(("lisp2d"	stat) device) → (9 0)
- (stat	rdevice) - список чисел ( major minor ). Идентификатор устройства (для специального файла).
- 
('s set ("lisp2d" stat))
 (s	device) → (9 0)
 (s	rdevice) → (0 0)
 ('s set ("/dev/tty" stat))
 (s	device) → (0 6)
 (s	rdevice) → (5 0)
- (stat	inode) - число, номер индексного узла.
- (("lisp2d" stat)	inode) → 1714521
- (stat	permissions) - список прав, может содержать символы svtx , sgid ,
suid , xoth , woth , roth , xgrp , wgrp , rgrp , xusr ,
wusr , rusr .  см. права
- (("."  stat)	permissions) → (xoth roth xgrp rgrp xusr wusr rusr)
- (stat	file-type) - символ, тип файла. ( socket , link , regular , block , directory , character , fifo , ? ) .
- (("."  stat)	file-type) → directory
- (stat	links) - число, количество жёстких ссылок.
- (("lisp2d" stat)	links) → 1
- (stat	uid) - число, идентификатор пользователя файла.
- (("lisp2d" stat)	uid) → 1001
- (stat	gid) - число, идентификатор группы файла.
- (("lisp2d" stat)	gid) → 100
- (stat	totalsize) - размер файла в байтах.
- (("lisp2d" stat)	totalsize) → 1198880
- 
(stat	blocksize) - оптимальный размер блока для операций ввода-вывода.
- 
(("." stat)	blocksize) → 4096
- 
(stat	blocks) - общее число блоков по 512 байт.
- 
(("." stat)	blocks) → 8
- 
(stat	access-time) - время последнего обращения. Возвращает объект класса time.
- 
(stat	modify-time) - время последнего изменения. Возвращает объект класса time.
- 
(stat	change-time) - время последнего изменения статуса. (например : owner, group, количество links, mode, итд.) Возвращает объект класса time.
Окна
- 
('window newobject width height) – создаёт окно шириной width и высотой height. Возвращает объект для работы с окном.
- 
(window	window [width height]) – коструктор. 
(win	close) – закрывает окно
  Координаты определяются слева направо и сверху вниз.
(nil	mapwindow	width	height) – создаёт окно без вывода на экран.
(window-mapped	open) – отображает окно на дисплее. Возвращается окно или false.
(window	openp) – открыто ли окно.
(window	hide) – закрывает окно, оставляя изображение.
  Прорисовка изображения с закрытым окном намного быстрее.
(win	rename	string) – даёт заголовок окну.
(win	move	x y) – переносит окно на координату (x y)
(win	resize	w h) – изменяет размеры окна и матрицу цветов
(win map-resize ширина высота) – изменяет размер матрицы цветов.
- 
(nil display-size) – возвращает размеры дисплея в пикселях как список чисел (width height)
- 
(nil display-size) → (1280 1024)
- 
(nil display-sizemm) – возвращает размеры дисплея в милиметрах как список чисел (width height)
- 
(nil display-sizemm) → (342 271)
 
(nil screen-count) – возвращает целое число.
(win	width) - ширина окна в пикселях
(win	height) - высота окна в пикселях
(window	pointer-coord) - возвращает локальные координаты указателя как список (x y).
- 
(window  wait-event) - ожидает событие в окне и возвращает его.
- 
  События предоставляются списком, где первым элементом предоставляется символ. С каждым событием может быть предоставлена вспомогательная информация. Поддерживаются такие события:
- 
(button-press button x y) - нажатие на клавишу мыши. button - номер кнопки: число 1..7. x,y - координата указателя мыши в момент события.
- 
(button-release button x y) - отпускание клавиши мыши. button - номер кнопки: число 1..7. x,y - координата указателя мыши в момент события.
- 
(key-press char|number) - нажатие на кнопку клавиатуры.  Возвращается char, если кнопка предоставляет собой букву в кодировке UTF-8, иначе number как код управляющей клавиши. Коды клавиш предоставлены значениями глобальных переменных: xk-enter, xk-home, xk-end, xk-left, xk-right, xk-up, xk-down, xk-page-up, xk-page-down, xk-insert, xk-delete, xk-caps-lock, xk-shift-l, xk-shift-r, xk-control-l, xk-control-r, xk-alt-l, xk-alt-r, xk-f1, xk-f2, xk-f3, xk-f4, xk-f5, xk-f6, xk-f7, xk-f8, xk-f9, xk-f10, xk-f11, xk-f12, xk-backspace, xk-undo, xk-num-lock, xk-kp-multiply, xk-space, xk-numbersign, xk-question
- 
(key-release) - отпускание кнопки клавиатуры.
- 
(window-close) - нажатие клавиши закрыть окно.
- 
(configure-notify ширина высота) - изменение размера окна.
(window  check-event) - попытка загрузки события в окне, при отсутствии события возвращается nil.
(window  make-event ev) - добавляет событие окну. Возвращает событие.
(window  pending) - возвращает количество уже накопившихся событий окна.
(win	getpixel	x y) – возвращает цвет точки как (r g b), при координатах за пределами окна возвращает nil
(win	draw-pixel col|(colr colg colb) x y x y … x y) – рисует точки на экране заданным цветом [0…1] Если цветом поставлено число, то будет серым оттенком, иначе ([0…1] [0…1] [0…1])=(red green blue)
  У координаты x берётся только целая часть, находятся от 0 до width-1
  У координаты y берётся только целая часть, находятся от 0 до height-1
  Такой смысл координат только для работы с пикселями.
  У функций прорисовки не для работы с пикселями координаты в окне это числа с плавающей запятой от 0 до width(height). Запуск функций прорисовки при координатах за этими пределами не приводит к ошибке а игнорируется.
(win	draw-square	col|(colr colg colb) x y w h … x y w h) – рисует закрашенные прямоугольники заданным цветом [0…1] Если цветом поставлено число, то будет серым оттенком, иначе ([0…1] [0…1] [0…1])=(red green blue)
  Начальным углом обозначается x y , ширина и высота w h.
  Координаты для прорисовки в окне задаются числами с плавающей запятой от 0 до width(height). Чтобы закрасить всё окно в один цвет можно сделать это так:
   (win	draw-square col 0 0 w h).
  Чтобы нарисовать линии по краю окна можно использовать:
  (win	draw-square col 0 0 1 h 0 0 h 1 0 h w -1 w 0 -1 h)
  Нарисовать одну точку:
   (win	draw-square col x y 1 1)
  Если координаты не целые функция draw-square сглаживает изображение. Поэтому можно прорисовать очень много маленьких прямоугольников и это дает эффект полупрозрачности.
(nil	let	((size	200)	halfsize	shift	w	(map	10)	size/map)
  (nil	setq
    halfsize	(size	/	2)
    shift	(size	/	20)
    size/map	(size	/	map)
    w	('window  newobject	(size	+	1)	(size	+	1)))
  ((map	+	1)	for	i
    (w	draw-square	'(0	1	1)
      0	(i	*	size/map)	(size	+	1)	1
      (i	*	size/map)	0	1	(size	+	1)))
  (halfsize	for	i
    (w	draw-square '(1 0 0)  
      (i -	shift) (i	+	shift) halfsize (i	/	halfsize)))
  (halfsize	for	i
    (w	draw-square '(0 0 1)  
      (i	+	shift) (i -	shift) (i	/	halfsize)	halfsize))
  (cout	write	"press a key...")
  (nil  let (en)
    (nil  do-while
      (nil  setq  en  ((w wait-event) first))
      (nil  not (nil  or  (en = 'key-press) (en = 'button-press)))))
  (w	close))

(win	draw-line	col|(colr colg colb) radius	x y x y … x y) - рисует линии заданным цветом [0…1]. Если цветом поставлено число, то будет серым оттенком, иначе ([0…1] [0…1] [0…1])=(red green blue). radius - задаёт толщину линии, точнее радиус.
Пространство имён
  Предназначено оно для ослабления перегрузки имён функций и констант.
Рекомендуется определять функции и переменные в личном пространстве, так как если пользоваться другими программами и они переопределят функцию с таким-же названием - то доступиться до неё нельзя. 
('name	namespace {body}) - подключает все константы и функции определённые в данном пространстве имён и выполняются пошагово задачи body.
  Определять эти константы очень просто: 
('version1	namespace 
  ('conste	letset	1000)
  (nil	defmethod m (x) 
    (cout	write "x=" x)))
('version1	namespace
  (nil	m conste))
  Извне этого пространства невозможно ими пользоваться:
conste → error 
(nil	m 1) → error 
Почти все функции языка определены в пространстве имён std и можно вызывать эти функции с перегруженным определением другими программами так:
('another	namespace
  ('number	defmethod	! () (cout	write "another"))
  …
  ('std	namespace
    (3	!) → 6 
    …)
  …)
Дата и время
- 
(nil	daylightp) - время часового пояса должно корректироваться с использованием летнего времени.
- 
(nil	daylightp) → TRUE
- 
(nil	setdaylightp	flag) - установка флага того, что время часового пояса должно корректироваться с использованием летнего времени
- 
(nil	timezone) - смещение часового пояса в секундах
- 
((nil	timezone)	/	60	60) → -2
- 
(nil	settimezone	sec) - установка смещении часового пояса в секундах
- 
(nil	tzname) - строки, характеризующие часовой пояс
- 
(nil	tzname) → ("EET" "EEST")
- 
(nil	settzname		string	string) - установка строк, характеризующих часовой пояс
- 
 (nil	time {form}) - вычисляет пошагово формы form и возвращает время выполнения в секундах.
- 
(nil	time 1) → 0.00088 
- 
(nil	localtime) - возвращает объект класса time.
- 
(nil	localtime) → Time(2008 4 19 17 51 28.0957 6 109 true)
  Определён класс объектов time, у которых есть методы.
- 
(time year)
 (time setyear integer)
- 
(time month) → 1…12
 (time setmonth integer)
- 
(time day) → 1…31
 (time setday integer)
- 
(time hour) → 0…23
 (time sethour integer)
- 
(time minutes) → 0…59
 (time setminutes integer)
- 
(time seconds) → 0…59.999999
 (time setseconds number)
- 
(time weekday) → 0…6
- 
0 = воскресенье
- 
(time yearday) → 0…365
- 
(time dstp) - время часового пояса должно корректироваться с использованием летнего времени. Возвращает true|false|nil.
- 
(time number) - время в секундах прошедших с 1 января 1970 года по UTC (Гринвичу). Используется для синхронизации по времени.
- 
(time string)
- 
((nil localtime) string) → "Sun Apr 20 19:43:08 2008"
- 
(nil	uptime) - время в секундах, прошедшее с момента загрузки системы
- 
(nil	uptime) → 8301
- 
('time newobject) → Time(1970 1 1 3 0 0 4 0 false)
 ('time newobject time)=(time copy)
 ('time newobject number) - установка времени, исходя из нулевой точки: 1 января 1970г. UTC (Greenwich)
- 
(time time time)=(time setf time)
 (time time number) - установка времени, исходя из нулевой точки: 1 января 1970г. UTC (Greenwich)
- 
(time setf time)
- 
(time swap time)
- 
(time = [{x}]),
(time <> [{x}]),
(time < [{time}]),
(time > [{time}]),
(time <= [{time}]),
(time >= [{time}]),
(time min [{time}]),
(time max [{time}])
Каталоги
  Для работы с каталогами существует класс dir.
- 
('dir newobject)=('dir newobject ".")
 ('dir newobject string-path)
 (dir dir string-path)=(dir open string-path)
 
(dir swap dir)
(dir open string-path) - открытие каталога.
(dir openp) - открыт или нет.
(dir	close) - закрытие каталога.
(dir	read) - возвращает строку или nil (если файлы закончились).
- 
  Программа вывода содержимого текущего каталога:
- 
(nil	let	(s	(d	('dir	newobject)))
 (nil	do-while
 (nil	if	('s	set	(d	read))
 (cout	writeln	s)))
 (d  close))
 
(dir	rewind) - переход в начало каталога.
- 
(dir	seek integer-loc) - переход к требуемому местоположению.
- 
integer-loc - это НЕ порядковый номер элемента каталога.
- 
(dir	tell) - получить текущую позицию в каталоге.
- 
Позиция - это НЕ порядковый номер элемента каталога.
(string	rmdir) - удаляет пустой каталог. Возвращает nil или символ ошибки access, busy, fault, inval, loop, nametoolong, noent, nomem, notdir, notempty, perm, rofs.
- (nil	getcwd) - строка, имя текущего каталога.
- (nil	getcwd) → "/home/alex/lisp2d"
- 
(string-name	mkdir [{access-mode}]) - создаёт каталог с правами доступа. По умолчанию у владельца полный доступ, у остальных только просмотр. access-mode могут быть символы rwxusr, rusr, wusr, xusr, rwxgrp, rgrp, wgrp, xgrp, rwxoth, roth, woth, xoth, suid,  sgid, svtx. см. права
 
Socket. Сети.
- 
('socket newobject)
- 
(socket socket)
- 
(socket open
 domain
 type ) - возвращает nil или
строку "PROTONOSUPPORT"|"NFILE"|"MFILE"|"ACCES"|"NOBUFS"|"NOMEM"|"INVAL"|"?".
- 
domain = ("UNIX" | "LOCAL" | "INET" | "INET6" | "IPX" | "NETLINK" | "X25" | "AX25" | "ATMPVC" | "APPLETALK" | "PACKET")
 type = ("STREAM" | "DGRAM" | "SEQPACKET" | "RAW" | "RDM")
- 
(socket descriptor) - возвращает число положительное при связанном сокете или -1 в отсутствии подключения.
- 
(socket close)
- 
domain = "UNIX" :
 (socket connect string-path) - возвращает nil или строку ( "BADPATH" | "BADF" | "FAULT" | "NOTSOCK" | "ISCONN" | "CONNREFUSED" | "TIMEDOUT" | "NETUNREACH" | "ADDRINUSE" | "INPROGRESS" | "ALREADY" | "AGAIN" | "AFNOSUPPORT" | "ACCES" | "PERM" | "ADDRNOTAVAIL" | "INVAL" | "INTR" | "PROTOTYPE" | "NOSR" | "?" ).
- 
Подключение клиентское желательно делать циклом с паузой.
 
(nil  let ((socketname  (nil  const "Мой Сокет")))
  (nil  let ((sc  ('socket  newobject)))
    (sc open  "UNIX"  "STREAM")
    (nil  while (sc connect socketname)
      (1  sleep))
    …))
- 
domain = another :
 (socket connect number-port string-addr) - возвращает nil или строку ( 
"NOADDRSUCCEEDED" | "BADADDR" | "?" | "ADDRFAMILY" | "AGAIN" | "BADFLAGS" | "FAIL" | "FAMILY" | "MEMORY" |
"NODATA" | "NONAME" | "SERVICE" | "SOCKTYPE" | "SYSTEM" | "??" ).
- 
- 
(socket bind number-port|string-path) - возвращает nil или строку 
"BADF" | "INVAL" | "ACCES" | "NOTSOCK" | "ROFS" | "FAULT" | "NAMETOOLONG" | "NOENT" | "NOMEM" | 
"NOTDIR" | "LOOP" | "?"
- 
(socket listen n-connections) - возвращает nil или строку 
"ADDRINUSE" | "BADF" | "NOTSOCK" | "OPNOTSUPP" | "?"
- 
Включение UNIX сервера задаётся последовательностью вызовов: создание socket-файла, open, bind, listen.
 
(nil  let ((socketname  (nil  const "Мой Сокет")))
  (socketname unlink)
  (nil  let ((sc  ('socket  newobject)))
    (sc open  "UNIX"  "STREAM")
    (sc bind  socketname)
    (sc listen  socket-max-connections)
    …
    (sc close))
  (socketname unlink))
- 
(socket accept) - возвращает новый сокет при успехе или при ошибке строку 
"AGAIN" | "BADF" | "NOTSOCK" | "OPNOTSUPP" | "INTR" | "CONNABORTED" | "INVAL" | "MFILE" | "NFILE" | 
"FAULT" | "NOBUFS" | "NOMEM" | "PROTO" | "PERM" | "NOSR" | "SOCKTNOSUPPORT" | "PROTONOSUPPORT" | 
"TIMEDOUT" | "?".
- 
При реализации функции сервера цикл вызовов accept желательно сделать в отдельном потоке.
 
(nil  fork|parallel
  (nil  while (nil  not flagtoquit)
    ('s set (socket accept))
    …  ))
- 
((( … socket-read … ) ( … socket-write … ) ( … socket-error … )) socket-select [time-out-seconds]) - проверяет способность сокетов для чтения из них (и/или они ожидают информацию) (и/или произошла ошибка). Возвращается список списков сокетов, прошедших проверку: (( … socket-read … ) ( … socket-write … ) ( … socket-error … )). Если предоставлен аргумент time-out-seconds, функция может выйти из ожидания и вернуть результат nil. При ошибке может вернуться строка "BADF"|"INTR"|"INVAL"|"NOMEM"|"?".
- 
(socket read byte-vector-buf [size [{"OOB"|"PEEK"|"WAITALL"|"TRUNC"|"ERRQUEUE"|"NOSIGNAL"}]] ) - получает сообщение из сокета размером с размер буфера или size. Возвращает число - количество принятых байт или строку - ошибку "BADF"|"CONNREFUSED"|"NOTCONN"|"NOTSOCK"|"AGAIN"|"INTR"|"FAULT"|"INVAL"|"?". 
- 
(socket write string [{"OOB"|"DONTROUTE"|"DONTWAIT"|"NOSIGNAL"|"CONFIRM"}] )
 (socket write byte-vector-buf [size [{"OOB"|"DONTROUTE"|"DONTWAIT"|"NOSIGNAL"|"CONFIRM"}]] ) - отправляет сообщение в сокет размером с размер буфера или size.
-  Возвращает число - количество отправленных байт или строку - ошибку "BADF"|"NOTSOCK"|"FAULT"|"MSGSIZE"|"AGAIN"|"NOBUFS"|"INTR"|"NOMEM"|"INVAL"|"PIPE"|"?". 
- 
(nil open-protoent)
- 
(nil close-protoent)
- 
(nil get-protoent) - возвращает список(number name alias .. alias) или nil
Системные функции
- 
(string-filename	system [{string-argument}]) - даёт задачу операционной системе. Возвращается код завершения задачи: 0…255 или nil или список (signal номер).
- 
("ls" system "--help") - консольный запрос.
 ("mc"	system) - запускает программу.
- 
(string	getenv) - переменная среды
- 
("USER"	getenv) → "alex"
 ("USEr"	getenv) → NIL
 ("HOME"	getenv) → "/home/alex"
- 
(nil	environ-list) - список строк всех переменных среды формы "имя=значение"
- 
(nil	environ-list) → ("XDG_VTNR=7" … "_=./lisp2d")
 
- 
(string	setenv	string) - устанавливает переменную среды. Возвращает символ ошибки или nil.
- 
("ABC"	setenv	"DEF")
 ("ABC"	getenv) → "DEF"
(string	unsetenv) - сброс значения переменной среды. Возвращает символ ошибки или nil.
(nil	geteuid) - число, номер идентификатора пользователя
(nil	getegid) - число, номер идентификатора группы
Пользователь root имеет номер идентификатора 0
(nil	getuid) - число, реальный номер идентификатора пользователя
(nil	getgid) - число, реальный номер идентификатора группы
Пользователь root имеет номер идентификатора 0
(nil	sysname) - строка, имя операционной системы, например "Linux"
- 
(nil	release) - строка, номер версии ядра операционной системы
- 
(nil	release) → "2.6.8.1-12mdk"
- 
(nil	version) - строка, модификация ядра операционной системы
- 
(nil	version) → "#1 Fri Oct 1 12:53:41 CEST 2004"
- 
(nil	machine) - строка, платформа на которой работает система
- 
(nil	machine) → "i686"
- 
(nil	nodename) - строка, имя компьютера
- 
(nil	nodename) → "localhost"
- 
(nil	totalram) - общий объём оперативной памяти в байтах
- ((nil	totalram) / 0x400) → 256376
- (nil	freeram) - свободный объём оперативной памяти в байтах
- ((nil	freeram) / 0x400) → 61812
- (string	accessf) - проверка доступа или существования файла
- ("Makefile"	accessf) → "Makefile"
 ("MakeFile"	accessf) → FALSE
- (string	accessx) - проверка исполнимости файла
- ("lisp2d"	accessx) → "lisp2d"
 ("lisp2d.cpp"	accessx) → FALSE
- (string	accessr) - проверка доступа на чтение файла
- ("lisp2d"	accessr) → "lisp2d"
 ("lisp2dd"	accessr) → FALSE
- (string	accessw) - проверка доступа на запись в файл
- ("lisp2d"	accessw) → "lisp2d"
 ("lisp2dd"	accessw) → FALSE
- (string-filename	setuid number) - устанавливает идентификатор пользователя файлу.
- (string-filename	setgid number) - устанавливает идентификатор группы пользователей файлу.
- (string-filename	setluid number) - устанавливает идентификатор пользователя ссылки, а не объекта ссылки.
- (string-filename	setlgid number) - устанавливает идентификатор группы ссылки, а не объекта ссылки.
- 
(string-filename	settime [time-access [time-modify]]) - устанавливает время доступа и время изменения файла. При отсутствии аргументов устанавливается текущее время. Возвращает символ ошибки.
(string-oldpath	link	string-newpath) - создание жёсткой ссылки на файл, не являющейся каталогом. Возвращается символ ошибки или nil.
(string-oldpath	symlink	string-newpath) - создаёт символическую ссылку.
(string-path	readlink) - возвращает строку содержимого файла символической ссылки. При ошибке возвращается её символ.
(string	unlink) - удаляет файл/снимает членство в каталоге. Возвращает nil при успехе или символ ошибки.
- (string	rename	string) - изменяет имя или позицию файла/каталога.
Возвращает символ ошибки или nil.
- ("readme"	rename  "doc/readme") → nil
- (string	ls) - чтение содержимого каталога, возвращает список имён. При ошибке, возвращается её символ.
- ("."	ls) → ("." ".." "tmp" ".desktop" "work.cpp" …)
 (".."	ls) → ("." ".." "alex")
(nil	nprocs) - число, количество процессоров системы
(number	seteuid) - устанавливает действующий идентификатор пользователя. Возвращает успех: true или false.
- 
(number	setuid) - устанавливает реальный идентификатор пользователя. Возвращает успех: true или false. Работает только от прав суперпользователя.
- 
(1002	setuid) → false
(number	setegid) - устанавливает действующий идентификатор группы. Возвращает успех: true или false.
- 
(number	setgid) - устанавливает реальный идентификатор группы. Возвращает успех: true или false. Работает только от прав суперпользователя.
- 
(1002	setgid) → false
- 
(string	vfsblocksize) - оптимальный размер блока для операций ввода-вывода. При неудаче возвращается nil.
- 
("."	vfsblocksize) → 4096
- 
(string	frsize) - фундаментальный размер блока. При неудаче возвращается nil.
- 
("."	frsize) → 4096
- 
(string	vfsblocks) - общее число блоков. При неудаче возвращается nil.
- 
("."	vfsblocks) → 4046090
- 
(string	bfree) - количество свободных блоков для суперпользователя. При неудаче возвращается nil.
- 
("."	bfree) → 3308030
- 
(string	bavail) - количество свободных блоков для обыкновенного пользователя. При неудаче возвращается nil.
- 
("."	bavail) → 3102499
- 
(string	files) - общее количество индексных узлов. При неудаче возвращается nil.
- 
("."	files) → 2056320
- 
(string	ffree) - количество свободных индексных узлов для суперпользователя. При неудаче возвращается nil.
- 
("."	ffree) → 2036930
- 
(string	favail) - количество свободных индексных узлов для обыкновенного пользователя. При неудаче возвращается nil.
- 
("."	favail) → 2036930
- 
(string	fsid) - идентификатор файловой системы. При неудаче возвращается nil.
- 
("."	fsid) → 1218234540
- 
(string	rdonly) - флаг только для чтения: true или false. При неудаче возвращается nil.
- 
("."	rdonly) → FALSE
- 
(string	nosuid) - возможность setuid/setgid отключена: true или false. При неудаче возвращается nil.
- 
("."	nosuid) → FALSE
- 
(string	namemax) - максимальная длина имени файла.
  При неудаче возвращается nil.
- 
("."	namemax) → 255
(string	setusrreadp	flag) - При ошибке возвращается её символ.
(string	setusrwritep	flag)
(string	setusrexecp	flag)
(string	setgrpreadp	flag)
(string	setgrpwritep	flag)
(string	setgrpexecp	flag)
(string	setothreadp	flag)
(string	setothwritep	flag)
(string	setothexecp	flag)
(string	setuidp	flag) - право на изменение идентификатора пользователя при исполнении.
(string	setgidp	flag) - право на изменение идентификатора группы при исполнении.
(string	setvtxp	flag) - ограниченный режим удаления из каталога.
(number-uid	uname) - имя пользователя (login).
(number-uid	gid) - числовой идентификатор группы по умолчанию.
(number-uid	home) - строка, домашний каталог.
(number-uid	shell) - командный интерпретатор по умолчанию.
(number-gid	gname) - имя группы.
(number-gid	gmem) - члены группы.
(nil getlogin) - строка, имя пользователя.
(nil getpid) - возвращает идентификатор процесса.
(nil getppid) - возвращает идентификатор родительского процесса.
(string-path chroot) - изменяет корневой каталог "/". Работает только от прав суперпользователя. Возвращает символ ошибки.
(number nice) - изменение приоритета процесса. Возвращается новый приоритет или nil. Меньший приоритет даёт больше прав.
(nil sethostent stayopen) - запустить обзор базы данных хостов. stayopen - должен быть true|obj или false|nil. Возвращается nil. При ошибке возвращается true.
- 
(nil gethostent) - получить следующую запись из базы данных хостов. Возвращается список("официальное_имя_хоста" список("альтернативных_имён_хоста") inet|inet6|integer длина_каждого_адреса список(адресов=список(целые_числа))) или nil.
- 
(nil sethostent true) → nil
 (nil gethostent) → ("localhost" nil inet 4 ((127 0 0 1)))
 (nil endhostent) → nil
(nil endhostent) - завершить обзор базы данных хостов. Возвращается nil.  При ошибке возвращается true.
(nil address-of x) - возвращается физический адрес объекта в памяти компьютера.
(число-секунды sleep) - засыпание на нужное количество секунд. Возвращается оставшееся время  при некоторых событиях, обычно 0.
(число-уровень iopl) - изменяет уровень привилегий ввода-вывода вызывающего процесса, как определено двумя младшими значащими битами на уровне. ( число-уровень = 0 .. 3 ) Возвращается ошибка : true - если число не целое или символ inval, nosys, perm.
(число-порт in-byte|in-byte-pause) - возвращает один байт принятый из порта, или символ inval, io, nomem, perm.
(число-порт in-byte-vector байт-вектор|размер) - возвращает новый байт-вектор предоставленого размера или заполненный данными предоставленый байт-вектор. При ошибке возвращается символ inval, io, nomem, perm.
(число-порт out-byte|out-byte-pause 0..255) - посылает в порт один байт, возвращает nil или символ inval, io, nomem, perm.
(число-порт out-byte-vector байт-вектор) - посылает в порт вектор байт, возвращает nil или символ inval, io, nomem, perm.
- 
(stream getwinsize) - из потока считывает размеры окна в символах и возвращает список (ширина высота). При ошибке возвращает один из символов: notfd , badf , fault , inval , notty.
- 
( ( "/dev/stdout" open 'out ) getwinsize ) → (146 39)
Предметный указатель
&const
&rest
&whole
#\backspace
#\bell
#\escape
#\feed
#\newline
#\null
#\return
#\space
#\tab
#\vtab
!
+ list
+ number
+ string
+ symbol
+	vector
+= cons
+= number
+= string
+= vector
- number
- symbol
-	vector
-= number
-= vector
-> imply
*	number
*	vector
*=	number
*=	vector
/
/=
= char
= cons
= false
= nil
= number
= string
= symbol
= time
= true
= vector
<> char
<> cons
<> false
<> nil
<> number
<> string
<> symbol
<> time
<> true
<> vector
< char
< number
< string
< symbol
< time
<= char
<= number
<= string
<= symbol
<= time
> char
> number
> string
> symbol
> time
>= char
>= number
>= string
>= symbol
>= time
%
^ expt
∧ and
⊼ nand
∨ or
⊽ nor
⊻ xor
'
`
,
,@
¬ not
∀ for number
λ lambda
√ sqrt
∛ cbrt
abs
accept
accessf
accessr
access-time
accessw
accessx
acons
address-of
alphap
and
apply
arccos
arcosh
arcsin
arctan
arg
arg number
arsinh
artanh
assoc
atom
back btree-node
back byte-vector
backquotep
bavail
begin btree
begin btree-node
bfree
bifp
bind
blocks
blocksize
booleanp
boundp
btree
btreep
btree-node
btree-nodep
button-press
button-release
byte-vector byte-vector
byte-vector char
byte-vector string
byte-vectorp
cbrt
ceil
cerr
change-owner-group
change-time
char byte-vector
char char
char number
charp
chdir
check-event
chroot
cin
clear btree
clear byte-vector
clear vector
close dir
close socket
close stream
close window
close-protoent
combin
combina
cond
configure-notify
conj
connect
cons nil
cons cons
consp
const nil
const symbol
constp nil
constp symbol
contain  byte-vector
contain	list
contain	string
contain	vector
content
controlp
copy  btree
copy  btree-node
copy  byte-vector
copy	char
copy	cons
copy	number
copy	object
copy	string
copy	time
copy	vector
copy-list
copy-list-protected
copy-matrix
copy-tree
cos
cosh
count list
count string
count vector
count-if list
count-if string
count-if vector
cout
create
cot
coth
cycledp
day
daylightp
defclass
defmacro
defmethod
defstatic
defvar
degrees
denom
descriptor
device
digitp
dir
display-size
display-sizemm
do-while
draw-line
draw-pixel
draw-square
dstp
e
elt byte-vector
elt list
elt string
elt vector
empty btree
empty byte-vector
empty vector
end btree
end btree-node
endhostent
environ-list
environment
environment-external
envp
eq
erase btree
erase btree-node
erf
eval
evenp
exception
exception-history
exp
false
favail
ffree
files
file-type
find btree
find btree-node
find list
find string
find vector
find-if list
find-if string
find-if vector
finitep
first cons
first vector
floor
flush
for list
for number
for string
for vector
for* list
for* number
for* string
for* vector
fork
freeram
front
frsize
fsid
funcall
gcd
gensym
get
get-protoent
getclass
getcwd
getdebug
getegid
getenv
geteuid
getgid
gethostent
getlogin
getmethod
getpid
getpixel
getppid
getuid
getwinsize
gid number
gid stat
gmem
gname
height
hide
home
hour
if
imag
imply
in-byte
in-byte-pause
in-byte-vector
infp
inode
insert btree
insert btree-node
insert vector
integerp
inverf
iopl
key-press
key-release
lambda
last cons
last vector
lchange-owner-group
lcm
left
let
letset
link
links
list btree
list btree-node
list byte-vector
list nil
list string
list vector
list*
listen socket
listen stream
listp
ln
load
localtime
lockp
log nil
log number
log-list
lower char
lower string
lowerp
ls
lstat
machine
make-event
man
map cons
map vector
mapc cons
mapc vector
map-resize
mapwindow
max char
max number
max string
max symbol
max time
merge
method-less
min char
min number
min string
min symbol
min time
minutes
mkdir
mod
modify-time
month
move 
multinomial
namemax
namespace
nand
nanp
newobject btree
newobject btree-node
newobject byte-vector
newobject char
newobject cons
newobject dir
newobject lock
newobject number
newobject signal
newobject socket
newobject stat
newobject string
newobject symbols
newobject time
newobject vector
newobject window
next
nice
nil
nodename
nor
nosuid
not
nprocs
nsubst
nsubstitute list
nsubstitute string
nsubstitute vector
nsubstitute-if list
nsubstitute-if string
nsubstitute-if vector
num
number char
number number
number time
numberp
objectp
oddp
open dir
open socket
open string
open window
open-protoent
openp dir
openp stream
openp window
or
out-byte
out-byte-pause
out-byte-vector
package
pairlist
parallel
pending
permissions
pi
pointer-coord
polar
pop
pop-back
pop-front
prev
princ
print
printp
private
progn lock
progn nil
properties
push
push-back
push-front
put
quotep
radians
random
random-normal
randomcomplex
rassoc
rdevice
rdonly
read dir
read socket
read stream
read string
read-byte
read-char
read-eval-print
read-line
readlink
real
release
remove list
remove string
remove vector
remprop
rename string
rename window
resize byte-vector
resize string
resize vector
resize window
rest
reverse list
reverse vector
rewind
right
rmdir
root
round
save
screen-count
second
seconds
seek dir
seek stream
send
set btree
set lock
set symbol
setday
setdaylightp
setdebug
setegid
setelt byte-vector
setelt list
setelt string
setelt vector
setenv
seteuid
setf backquote
setf byte-vector
setf char
setf cons
setf number
setf quote
setf stat
setf string
setf time
setf unquote
setf unquote-splicing
setf vector
setfirst
setgid number
setgid string
setgidp
setgrpexecp
setgrpreadp
setgrpwritep
sethostent
sethour
setlgid
setluid
setminutes
setmonth
setothexecp
setothreadp
setothwritep
setq
setrest
setseconds
settime
settimezone
settzname
setuid number
setuid string
setuidp
setusrexecp
setusrreadp
setusrwritep
setvtxp
setyear
shell
signalp
sin
sinh
size btree
size byte-vector
size cons
size string
size vector
sleep
socket
socket-max-connections
socket-select
socketp
sort
spacep
sqrt
stat stat
stat stream
stat string
statp
streamp
string
string byte-vector
string number
string string
string time
stringp
subseq byte-vector
subseq list
subseq string
subseq vector
substitute
swap backquote
swap btree
swap byte-vector
swap char
swap cons
swap dir
swap number
swap quote
swap stat
swap string
swap time
swap unquote
swap unquote-splicing
swap vector
symbol
symbolp
symlink
sysname
system
tan
tanh
tell dir
tell stream
terpri
third
this
throw
time nil
time time
timep
timezone
totalram
totalsize
transpose
true
trunc
truncate
try lock
try nil
type-of
tzname
uid
uname
unconst nil
unconst symbol
unlink
unlock
unquotep
unquote-splicingp
unsetenv
upper char
upper string
upperp
uptime
vector btree
vector btree-node
vector byte-vector
vector cons
vector nil
vector string
vector vector
vectorp
version
vfsblocks
vfsblocksize
wait
wait-event
weekday
when
while
width
window
window-close
windowp
without
write socket
write stream
write-byte
writeln
xk-…
xor
year
yearday