Ufasoft BkLisp - LISP для RT-11, БК-0010.01, БК-0011М
Справочник

Версия 2023.2

Минимальный интерпретатор языка программирования LISP для микро-компьютеров БК-0010.01 и БК-0011М архитектуры PDP-11, на процессоре К1801ВМ1.

Есть вариант сборки под операционную систему RT-11 для оригинальных PDP-11 и компьютеров ДВК.

Оглавление

Базовые объекты
Списки
Множественные значения
Множества
Последовательности
Массивы
Строки и Characters
Символы
Числа
Ввод
Вывод
Файлы
Время
Генератор случайных чисел
Работа с функциями
Управление выполнением
Отладка
Коды ошибок
Литература
Индекс символов

Предыстория

1999 Ufasoft Common Lisp. Ядро на C++, использующее .lisp файлы CLISP. Портирован в том числе на Windows Mobile.

1987 Появился CLISP - самая портабельная реализация с ядром на Си.

1984 Из многочисленных реализаций LISP создали общий язык Common Lisp, стандартизованный ANSI в 1994 г.
Этот стандарт опубликован как Common Lisp HyperSpec (CLHS), составитель Кент Питман.

1972 Ричард Столлман впервые реализовал интерпретатор LISP на PDP-11. Впоследствии он развился в LISP11 для различных ОС фирмы DEC.

1958 Джон Маккарти сформулировал первый вариант языка LISP (от LISt Processing).

BkLisp

В дальнейшем данная реализация называется BkLisp.

Так как в отличие от 1970-х есть стандарт, то по возможности имена функций брались из него для совместимости. В этом существенное отличие от традиционного LISP11 и LISP 1.5.

Эта реализация полностью отличается от Ufasoft Common Lisp, написанного на C++ для современных компьютеров.

Исходный код на языке ассемблера MACRO-11 доступен на github.com/ufasoft/bklisp и на ufasoft.com/bklisp.

Автор: Sergey Pavlov dev@ufasoft.com

Лицензия

Код выпущен под лицензией MIT.

Допускается свободное использование, копирование и модификация при условии ссылки на оригинал.

Развитие Проекта

Наращивать функциональность на оригинальной платформе БК-0010.01 невозможно, не принося в жертву память, а значит сужая множество программ, способных запуститься. Остаётся путь портирования на другие платформы.

Из-за схожей системы команд, возможно портировать на процессор m68k.

BkLisp - некоммерческий проект. В то же время можно перечислить пожертвования на его развитие:

Отклонения от Common Lisp

Специфика BkLisp для БК-0010.01

Дополнения к возможностям COMMON LISP

Что реализовано

Функциональность Common Lisp, которая есть в BkLisp, но обычно отсутсвует в минимальных реализациях Lisp:

Что НЕ реализовано

Функциональность Common Lisp, которой нет в BkLisp:

При портировании BkLisp на платформы с большим количеством ОЗУ часть этой функциональности может быть реализована.

Справочник

Справа приведены ссылки на CLHS с более полной документацией. В BkLisp реализовано только подмножество функциональности CL, но то что реализовано - совместимо с CL насколько это было возможно при ограничениях платформы.

Терминология

Синтаксис

Комментарии

CLHS
(list '(1 2 3))     ; это однострочный комментарий

#| Это
   Многострочный комментарий
|#

#|
    Он также

    #| Может быть вложенным |#
|#
CLHS

Characters

CLHS

Начинаются с #\: #\D #\Щ #\9

Есть несколько именованных character:

Типы данных

Тип объекта можно получить вызвав (type-of object).

NULL

CLHS

Единственный объект этого типа: nil

Символ - SYMBOL

CLHS

Символ.

nil также является символом

CONS

Пара значений, основной элемент конструирования сложных объектов.

Список - LIST

CLHS

Объединяющее название для типов CONS и NULL.

CHARACTER

Однобайтовое значение к кодировке КОИ-8-БК.

В данном документе не используется русский перевод символ для этого понятия из-за неоднозначности в контексте LISP.

Строка - STRING

Строка, массив длиной 0..255 объектов типа CHARACTER.

Целое - INTEGER

FIXUM либо вещественное число у которого нет дробной части .

Короткое целое - FIXNUM

Целочисленное значение в диапазоне -1500..1500 (или более широком, зависит от версии BkLisp). Не занимает память в Куче.

Для объектов этого типа функция type-of возвращает тип INTEGER.

Вещественное - FLOAT

Число с плавающей запятой двойной точности (8 байт в Куче). К нему преобразуется и FIXNUM для любых арифметических действий.

Массив - ARRAY

БК-0011МRT-11

Массив. Строки и векторы являются массивами.

Массив может быть многомерным.

Для записи массива испольуется синтаксис: #рангA(...):
#2A((A B) (D E F)) - массив размерности (2 3).

Вектор - VECTOR

Простой вектор - SIMPLE-VECTOR

Одномерный массив. В BkLisp тип VECTOR совпадает с SIMPLE-VECTOR.

Длина вектора не может превышать максимальное значение типа FIXNUM.

Для записи вектора испольуется синтаксис: #(...):
#(A B C 9) - вектор размера 4

Поток - STREAM

Поток ввода или вывода.

Файл - FILE-STREAM

RT-11

Поток для чтения файла на диске.

Функция - FUNCTION

Пользовательская функция или LAMBDA-выражение.

Встроенная функция - SYSTEM-FUNCTION

Встроенная функция.

Оператор - SPECIAL-OPERATOR

Встроеные примитивы BkLisp, которые не являются функциями (их аргументы не обязательно вычисляются).

Так как в BkLisp нет макросов, многие макросы Common Lisp представлены в виде специальных операторов.

Базовые объекты

Константа NIL

CLHS

Представляет логическое значения ложь, а также пустой список.

Примеры

nilNIL


Константа T

CLHS

Каноническое представление логического значения истина.

Хотя любой не-NIL объект представляет истину, когда нет причин представлять её другим объектом, предпочтительно использовать T.

Примеры

tT


Списки

Аксессор CAR

car x → object
(setf (car x) new-object) → new-object CLHS

Если x - cons, car возвращает car этой cons-ячейки. (car nil) возвращает NIL.

(setf (car x) y) устанавливает car-поле cons-ячейки x в значение y.


Аксессоры CDR, REST

cdr x → object
(setf (cdr x) new-object) → new-object CLHS

rest x → object
БК-0011МRT-11 (setf (rest x) new-object) → new-object БК-0011МRT-11 CLHS

Если x - cons, cdr возвращает cdr этой cons-ячейки.

Если x - nil, возвращает nil.

rest и синонимы.

Примеры
(cdr '(1 . 2)) →  2

Функции CAAR, CDAR, CADR, CDDR

caar x → object CLHS
cdar x → object
cadr x → object
cddr x → object

Эквивалент
(caar x)(car (car x))
(cdar x)(cdr (car x))
(cadr x)(car (cdr x))
(cddr x)(cdr (cdr x))

Функция CONS

cons object-1 object-2 → cons CLHS

Создаёт cons-объект, car которого object-1 и cdr которого object-2.


Функция ACONS

acons key datum alist → new alist CLHS

Добавляет cons из key и datum к ассоциатиыному списку alist.

Эквивалент
(acons key datum alist) ≡ (cons (cons key datum) alist)

Функция ADJOIN

adjoin item list → new-list CLHS

Если item содержится в list возвращает list, иначе присоединяет item к list с помощью cons и возвращает новый список.

Эквивалент
(adjoin item list) ≡ (if (member item list) list (cons item list))

Функция ASSOC

assoc item alist → entry CLHS

Возвращает первый cons в ассоциативном списке alist, чей car совпадает с item.


Функция RASSOC

rassoc item alist → entry CLHS

Возвращает первый cons в ассоциативном списке alist, чей cdr совпадает с item.


Функция PAIRLIS

pairlis keys data &optional alist → new alist CLHS

Возвращает ассоциативный список, с ключами (car) из keys и величинами (cdr) из data. Cписки keys и data должны быть одинаковой длины.
Если задан alist, то новые пары добавляются к нему.

Порядок пар в результате не определён.

В некоторых языках эта функция называется zip.

Примеры
(psetq keys '(1 2 3)
       data '("one" "two" "three")
       alist '((4 . "four")))       →  NIL

(pairlis keys data alist)           →  ((3 . "three") (2 . "two") (1 . "one") (4 . "four"))

Функция ATOM

atom object → generalized-boolean CLHS

Возвращает истину если object - атом (не cons).

Противоположна функции consp.


Функция CONSP

consp object → generalized-boolean CLHS

Возвращает истину если object - cons.

Противоположна функции atom.


Функция LISTP

listp object → generalized-boolean CLHS

Возвращает истину если object - список (в том числе пустой).

Эквивалент
(listp x) ≡ (or (null x) (consp x))
Примеры
(listp (cons 1 2))T

Функция COPY-ALIST

copy-alist alist → new-alist CLHS

Клонирует списковую структуру alist. Элементы, являющиеся cons клонируются, остальные объекты попадают в результат как есть.

Примеры
(setq *alist* (acons 1 "one" (acons 2 "two" '())))  →  ((1 . "one") (2 . "two"))
(setq *list-copy* (copy-list *alist*))              →  ((1 . "one") (2 . "two"))
(setq *alist-copy* (copy-alist *alist*))            →  ((1 . "one") (2 . "two"))
(rplacd (assoc 2 *alist-copy*) "deux")              →  (2 . "deux")
*alist-copy*                                        →  ((1 . "one") (2 . "deux"))
*alist*                                             →  ((1 . "one") (2 . "two"))
(rplacd (assoc 1 *list-copy*) "uno")                →  (1 . "uno")
*list-copy*                                         →  ((1 . "uno") (2 . "two"))
*alist*                                             →  ((1 . "uno") (2 . "two"))

Функция COPY-LIST

copy-list list → copy CLHS

Создаёт копию списка, в том числе dotted-списка.

Примеры
(setq lst '(1 2 . 3))
(copy-list lst)
(1 2 . 3)
(eq (copy-list lst) lst)NIL

Функция COPY-SEQ

copy-seq sequence → copied-sequence CLHS

Создаёт shallow-копию последовательности sequence. Копируется только последовательность, не не её элементы.


Функция COPY-TREE

copy-tree tree → new-tree CLHS

Клонирует дерево cons-ячеек.

Если tree - не cons, оно становится результатом, иначе возвращает новый cons, составленный из результатов применения copy-tree к car и cdr этого cons.


Функция RPLACA

rplaca cons object → cons CLHS

Заменяет car ячейки cons на object.

Примеры

(setq a '(a . b ))(A . B)
(rplaca a 'c)(C . B)
a(C . B)

Побочные эффекты
Модифицирует cons.

Функция RPLACD

rplacd cons object → cons CLHS

Заменяет cdr ячейки cons на object.

Примеры
(rplacd '(1 2 3) 'tail)(1 . TAIL)
Побочные эффекты
Модифицирует cons.

Функция LENGTH

length sequence → n CLHS

Вычисляет количество элементов в списке, векторе или строке sequence.

Примеры
(length '(1 2 3))3
(length #())0
(length "Lisperati")9

Функция LIST

list &rest objects → list CLHS

Возвращает список объектов objects.

Примеры

(list 1 2 3)(1 2 3)


Функция LIST*

list* &rest objects+ → list CLHS

Похожа на list за исключением того, что последний аргумент objects становится cdr последней cons-пары результата.

Примеры

(list* 1 2 3)(1 2 . 3)


Функция LISTIFY

нестандартная

listify x → list

Если x - список, возвращает его, иначе создаёт спис из одного элемента x.

Примеры
(listify 1)     →  (1)
(listify '(1))  →  (1)

Функция LIST-LENGTH

list-length list → length CLHS

Для правильного списка возвращает его длину. Для циклического - NIL.

Примеры
(list-length '(a b c d))  →  4
(setq cycle '(a b))
(nconc cycle cycle)
(list-length cycle)       →  NIL

Функция MAKE-LIST

make-list size → list CLHS

Создаёт список длины size (неотрицательное целое), состоящий из nil.

Примеры
(make-list 3)  →  (NIL NIL NIL)

Аксессоры FIRST, SECOND, THIRD
FOURTH, FIFTH, SIXTH, SEVENTH, EIGHTH, NINTH, TENTH БК-0011МRT-11

first list → object
second list → object
third list → object
fourth list → object
БК-0011МRT-11 fifth list → object
БК-0011МRT-11 sixth list → object
БК-0011МRT-11 seventh list → object
БК-0011МRT-11 eighth list → object
БК-0011МRT-11 ninth list → object
БК-0011МRT-11 tenth list → object
БК-0011МRT-11 (setf (first list) new-object) → new-object
(setf (second list) new-object) → new-object
(setf (third list) new-object) → new-object
CLHS

Возвращают/присваивают соответственно первый, второй и третий элементы списка, если считать с единицы.

Эквивалент
(first list)  ≡ (car list)  ≡ (nth 0 list))
(second list) ≡ (cadr list) ≡ (nth 1 list))
(third list)  ≡ (nth 2 list))
Примеры
(setq lst '(1 2 3))        →  (1 2 3)
(second lst)               →  2
(setf (second lst) "two")  →  "two"
lst                        - (1 "two" 3)

Аксессор NTH

nth n list → object
(setf (nth n list) new-object) → new-object
CLHS

Возвращает/присваивает n-ый элемент списка list. Если длина списка меньше или равна n, возвращает NIL.

Примеры

(nth 1 '(A B C))B

(nth 5 '(A B C))NIL

Эквивалент
(nth n list)(car (nthcdr n list))

Функция NTHCDR

nthcdr n list → tail CLHS

Возвращает хвост списка list, получаемый после применения cdr n раз.

Примеры

(nthcdr 2 '(a b c)) (C)

(nthcdr 0 'A)A


Функция REVERSE

reverse sequence → reversed-sequence CLHS

Возвращает последовательность того же типа что sequence, содержащую элементы sequence в обратном порядке. Не модифицирует свой аргумент.


Функция NREVERSE

nreverse sequence → reversed-sequence CLHS

Обращает порядок элементов в sequence и возвращает её. В отличие от reverse модифицирует аргумент.


Функция APPEND

append &rest lists → concatenated-list CLHS

Возвращает список, являющийся конкатенацией списков lists.

В отличие от nconc списки не модифицируются, а копируются (кроме последнего).


Функция LAST

last list &optional (n 1) → tail CLHS

Возвращает последние n cons-ячеек в списке list. Если list - NIL, возвращает NIL.

Если n = 0, возвращает атом, завершающий list.

Если n ≥ количества cons-ячеек в list, возвращает полный list.

Примеры
(last '(1 2 3))    →  (3)
(last '(a b c) 4)  →  (A B C)

Функция BUTLAST

butlastlist &optional (n 1) → result-list CLHS

Возвращает копию list за исключением последних n cons-ячеек.

Если n > количества cons-ячеек в list, возвращает nil.

Исходный list не модифицируется.

Эквивалент
(butlast list n)(ldiff list (last list n))
Примеры
(butlast '(1 2 3 4 5) 2)  →  '(1 2 3)

Функция NCONC

nconc &rest lists → concatenated-list CLHS

Возвращает список, являющийся конкатенацией списков lists.

Деструктивная операция, все списки кроме последнего модифицируются (cdr последнего cons каждого списка указывает на следующий список).


Функция ENDP

endp list → boolean CLHS

Возвращает T если list пустой список NIL. Возвращает NIL, если list - cons.

В остальных случаях выбрасывает ОШИБКА 13.

При переборе списка надёжнее использовать endp, чем null, чтобы поймать cdr, не являющийся списком (случай dotted-list).


Функция NULL

null object → boolean CLHS

Возвращает t если object пустой список, иначе возвращает nil.

Синоним функции not, но применяется со списками.


Функция NOT

not x → boolean CLHS

Возвращает t если x ложь, иначе возвращает nil.

Синоним функции null, но применяется с логическими выражениями.


Функция SORT

sort sequence predicate → sorted-sequence CLHS

Упорядочивает элементы в sequence в соответсвии с предикатом predicate.

Предикат должен возвращать true, если первый аргумент предшествует второму (в произвольном смысле).

Деструктивная операция.

Примеры
(sort #(2 3 -5 3 4.5 0 1) #'>)  →  #(4.5 3 3 2 1 0 -5)

Функция LDIFF

ldiff list object → result-list CLHS

Если object - хвост list, возвращает список элементов, предшествущих этому хвосту, иначе возвращает копию list.


Функция SUBST

substr new old tree → new-tree CLHS

Подменяет в дереве tree листья, совпадающие с old на объект new и возвращает новое дерево.

Недеструктивная операция.

Примеры
(let ((tree '(1 (1 2) (1 2 3) (1 2 3 4))))
  (subst "two" 2 tree))                     →  (1 (1 "two") (1 "two" 3) (1 "two" 3 4))

Функция TAILP

tailp object list → generalized-boolean CLHS

Проверяет, является ли object хвостом списка list. Иными словами object совпадает (eql) с list, или с CDR одного из его cons-ячеек.


Функция MEMBER

member item list → tail CLHS

Ищет в списке list элемент item. Если находит - возвращает хвост списка, начинающийся с этого элемента, иначе возвращает NIL.

Эту функцию можно отнести к семейству Множества, реализует операцию ∈.


Множественные значения

Обычно функция возвращает одно значение. Но может вернуть несколько, в том числе ноль значений.

Первое из значений считается основным. Если функция не возвращает значений, а вызывающий код использует результат, то основное значение NIL.

Этот раздел действителен только для сборки BkLisp под RT-11.


Оператор MULTIPLE-VALUE-LIST

multiple-value-list form → list CLHS БК-0011МRT-11

Возвращает список множественных результатов вычисления form.

Примеры
(multiple-value-list (progn (values 1 2)))  →  (1 2)

Константа MULTIPLE-VALUES-LIMIT

multiple-values-limit → 20 CLHS БК-0011МRT-11

Верхняя исключающая граница количества результатов функции.


Оператор NTH-VALUE

nth-value n form → object CLHS БК-0011МRT-11

Возвращает n-й по счёту (начиная с 0) результат вычисления form, или NIL если результатов меньше или равно n.

Примеры
(nth-value 1 (values 'a 'b))  →  B
Эквивалент
(nth-value n form)(nth n (multiple-value-list form))

Функция VALUES

values &rest object → object* CLHS БК-0011МRT-11

Возвращает объекты object как множественные значения.

Примеры
(values)        →
(values 1 2 3)  →  1, 2, 3  ;; в REPL напечатает:   1 ;
                                                    2 ;
                                                    3

Функция VALUES-LIST

values-list list → element* CLHS БК-0011МRT-11

Возвращает элементы list как множественные значения.

Примеры
(values-list nil)       →
(values-list '(1 2 3))  →  1, 2, 3
Эквивалент
(values-list list)(apply #'values list)

Множества

Множества представляются списками. Элементы сравниваются функцией eql. Пустое множество ∅ представляется nil.


Функция INTERSECTION

intersection list-1 list-2 → result-list CLHS

Пересечение множеств ( ).

Возвращает список из элементов, принадлежащих каждому из списков list-1 и list-2.

Порядок элементов в результате не определён.

Примеры
(intersection '(a b c f) '(f a d))  →  F A)

Функция SET-DIFFERENCE

set-difference list-1 list-2 → result-list CLHS

Разность множеств ( ).

Возвращает список из элементов list-1, не принадлежащих list-2.

Порядок элементов в результате не определён.

Примеры
(set-difference '(a b c f) '(f a d))(C B)

Функция SUBSETP

subsetp list-1 list-2 → generalized-boolean CLHS

Проверка на подмножество ( ).

Возвращает true, если каждый элемент list-1 входит и в list-2.

Примеры
(subsetp '(a b c) '(f a d))NIL
(subsetp '() '(f a d))T

Функция UNION

union list-1 list-2 → result-list CLHS

Объединение множеств ( ).

Возвращает список из элементов, принадлежащих хотя бы одному из списков list-1 и list-2.

Порядок элементов в результате не определён.

Примеры
(union '(a b c) '(f a d))(C B F A D)

Последовательности

Последовательность - объединяющее название типов: список, вектор и строка.

Аксессор ELT

elt sequence index → object
(setf (elt sequence index) new-object) → new-value
CLHS

Возвращает/присваивает index-ый элемент последовательности sequence.

Примеры
(elt #(A B C) 1)  →  B
(elt "ABC" 1)     →  #\B

Функция FILL

fill sequence item → sequence CLHS

Заполняет sequence объектами item.

Примеры
(fill "Hello" #\Z)  →  "ZZZZZ"
(fill #(A B C) 'Z)  →  #(Z Z Z)

Функция MAKE-SEQUENCE

make-sequence result-type size → sequence CLHS

Создаёт последовательность типа result-type размера size (неотрицательное целое).

result-type должен быть одним из символов: list, string или vector.

Примеры
(make-sequence 'string 3)  →  "   "
(make-sequence 'list 0)    →  NIL

Функция REMOVE

remove item sequence → result-sequence CLHS

Возвращает последовательность sequence из которой удалены все вхождения item. Исходная sequence не модифицируется.

Примеры
(remove 4 '(1 3 4 5 9))   →  (1 3 5 9)
(remove 'a #(a b a)       →  #(B)

Массивы

Функция ARRAY-DIMENSION

array-dimension array axis-number → dimension CLHS БК-0011МRT-11

Возвращает axis-number-ую размерность массива array.

Примеры

(array-dimension #(1 2 3) 0)3

Эквивалент
(array-dimension array n)(nth n (array-dimensions array))

Константа ARRAY-DIMENSION-LIMIT

array-dimension-limit → 7000 CLHS БК-0011МRT-11

Верхняя исключающая граница для каждой размерности массивов.

Может отличаться в разных версиях.


Функция ARRAY-DIMENSIONS

array-dimensions array → dimensions CLHS БК-0011МRT-11

Возвращает список размерностей массива array.

Примеры
(array-dimensions "Hello")  →  (5)

Функция ARRAY-IN-BOUNDS-P

array-in-bounds-p array &rest subscripts → generalized-boolean CLHS БК-0011МRT-11

Возвращает истину, если все индексы subscripts находятся в рамках границ массива.

Примеры
(array-in-bounds-p (make-array '(7 11)) 6 10)  →  T
(array-in-bounds-p (make-array '(7 11)) 0 -1)  →  NIL

Функция ARRAY-RANK

array-rank array → rank CLHS БК-0011МRT-11

Возвращает ранг (количество размерностей) массива array.

Примеры

(array-rank #(1 2 3))1

Эквивалент
(array-rank array)(length (array-dimensions array))

Константа ARRAY-RANK-LIMIT

array-rank-limit → 8 CLHS БК-0011МRT-11

Верхняя исключающая граница ранга (количества размероностей) массивов.


Функция ARRAY-ROW-MAJOR-INDEX

array-row-major-index array &rest subscripts → index CLHS БК-0011МRT-11

Возвращает позицию элемента array с индексами subscripts односительно начала массива в памяти.

Примеры
(let ((a (make-array '(2 3 4))))
  (array-row-major-index a 0 2 1))  →  9 ; 0*3*4 + 2*4 + 1

Функция ARRAY-TOTAL-SIZE

array-total-size array → size CLHS БК-0011МRT-11

Возвращает общее количество элементов в массиве.

Эквивалент
(array-total-size x)(apply #'* (array-dimensions x))
Примеры
(array-total-size (make-array '(2 3 5)))  →  30

Константа ARRAY-TOTAL-SIZE-LIMIT

array-total-size-limit → 7 CLHS БК-0011МRT-11

Верхняя исключающая граница общего количества элементов в массиве.

Может отличаться в разных версиях.


Функция ARRAYP

arrayp object → generalized-boolean CLHS БК-0011МRT-11

Возвращает истину если object - массив.

Векторы и строки - тоже массивы.


Функция MAKE-ARRAY

make-array dimension → new-array CLHS

make-array dimensions → new-array БК-0011МRT-11

Создаёт и возвращает массив с размерностями dimensions (список или число).

Если dimensions - число, то создаёт (простой вектор) этого размера, заполненный значением nil.

Примеры
(make-array 4)           →  #(NIL NIL NIL NIL)
(make-array '(2 3))      →  #2A((NIL NIL NIL) (NIL NIL NIL))	БК-0011МRT-11
(make-array '(100 100))  →  ОШИБКА 16					БК-0011МRT-11

Функция VECTORP

vectorp object → generalized-boolean CLHS

Возвращает истину если object - вектор.

Строки являются векторами.

Примеры
(vectorp #(a b c))  →  T
(vectorp "abc")     →  T
(vectorp '(a b c))  →  NIL

Функция SIMPLE-VECTOR-P

simple-vector-p object → generalized-boolean CLHS

Возвращает истину если object - простой вектор.

Примеры
(simple-vector-p #(a b c))T

Аксессор AREF

aref array &rest subscripts → element
(setf (aref &rest subscripts) new-element) → new-element
CLHS БК-0011МRT-11

Возвращает/присваевает элемент массива array, определяемый индексами subscripts.

Эквивалент
(aref array i1 i2 ...)(row-major-aref array (array-row-major-index array i1 i2 ...))
Примеры
(aref #(A B C) 2)                 →  C

(let ((ar (make-array '(2 3))))
  (list
    (setf (aref ar 1 2) 'Z)
    (aref ar 1 2)
    ar))                          →  (Z Z #2A((NIL NIL NIL) (NIL NIL Z)))

Аксессор ROW-MAJOR-AREF

row-major-aref array index → element
(setf (row-major-aref index) new-element) → new-element
CLHS БК-0011МRT-11

Возвращает/присваивает index-ый элемент массива array, если рассматривать его как одномерный сегмент памяти.


Аксессор SVREF

svref simple-vector index → element
(setf (svref simple-vector index) new-element) → new-element
CLHS

Возвращает/присваивает index-ый элемент вектора simple-vector.

Примеры
(svref #(1 2) 0)              →  1

(progn (setq v #(1 2))
       (setf (svref v 1) 'a)
       v)                     →  #(1 A)

Функция VECTOR

vector &rest objects → vector CLHS

Создаёт vector, состоящий из objects.

Примеры
(vector 1 2 'z nil)  →  #(1 2 Z NIL)

Строки и Characters

Функция ALPHA-CHAR-P

alpha-char-p char → generalized-boolean CLHS

Возвращает истину если char - буква.

Примеры
(alpha-char-p #\щ)  →  T
(alpha-char-p #\6)  →  NIL

Функция ALPHANUMERICP

alphanumericp char → generalized-boolean CLHS

Возвращает Истину если char - буква или цифра.

Примеры
(alphanumericp #\Г) → T
(alphanumericp #\6) → T

Аксессор CHAR

char string index → character
(setf (char string index) new-character) → new-character
CLHS

Возвращает/присваивает index-ый элемент строки string.

Примеры

(char "Abc" 1)#\b


Функция CHARACTER

character character-designator → character CLHS

Превращает character-designator в строку:

Примеры

(character 'a)#\A


Функция CHARACTERP

characterp object → generalized-boolean CLHS

Возвращает истину если object - character.

Примеры

(characterp #\A)T

(characterp "A")NIL


Функции сравнения CHAR=, CHAR/=, CHAR-EQUAL

char= &rest characters+ → generalized-boolean
char/= &rest characters+ → generalized-boolean
char-equal &rest characters+ → generalized-boolean
CLHS

char= Возвращает истину, если все characters равны. Эта операция case-sensitive.

char/= Возвращает истину, если все characters попарно разные. Эта операция case-sensitive.

char-equal Возвращает истину, если все characters одинаковы, игнорируя регистр букв. Эта операция case-insensitive.

Примеры
(char= #\d #\d #\d) 	  →  T
(char/= #\d #\a #\d)	  →  NIL
(char-equal #\A #\a #\A)  →  T

Функция CHAR-CODE

char-code char → code CLHS

Код (неотрицательное целое 0..255) char в кодировке КОИ-8-БК.

В BkLisp синоним функции char-int.

Примеры

(char-code #\D)68

(char-code #\ю)192


Функция CHAR-INT

char-int char → code CLHS

Код (неотрицательное целое 0..255) char в кодировке КОИ-8-БК.

В BkLisp синоним функции char-code.


Функция CODE-CHAR

code-char code → char-or-nil CLHS

Возвращает character с кодом code или NIL, если нет соответсвующего character.

Примеры

(code-char 65)#\A

(code-char 10)#\NEWLINE


Функция CHAR-NAME

char-name character → name CLHS

Возвращает имя character, если оно существует, иначе NIL.

Примеры

(char-name #\ )"SPACE"

(char-name (code-char 9))"TAB"

(char-name (code-char 13))"RETURN"

(char-name #\Newline)"NEWLINE"

(char-name #\A)NIL


Функция NAME-CHAR

name-char name → char-p CLHS

Возвращает character, чьё имя - name, или NIL, если такого не найдено.

Примеры

(name-char "newLINE")#\NEWLINE

(name-char "A")NIL


Функция DIGIT-CHAR

digit-char weight &optional radix → char-or-nil CLHS

Если weight меньше radix (основание системы счисления, по-умолчанию 10), возвращает character представляющий цифру weight в этой системе счисления. В случае если это буква, то в верхнем регистре.

Иначе возвращает NIL.

Примеры
(digit-char 15 16)  →  #\F
(digit-char 7)      →  #\7
(digit-char 11)     →  nil

Функция DIGIT-CHAR-P

digit-char-p char &optional radix → weight CLHS

Если char является цифрой в системе счисления radix (по-умолчанию 10), возвращает значение (weight) этой цифры.

Иначе возвращает NIL.

Примеры
(digit-char-p #\a 11)  →  10

Функция CHAR-DOWNCASE

char-downcase character → corresponding-character CLHS

Переводит character в нижний регистр, если это буква, или возвращает неизменным.

Примеры
(char-downcase #\Space)  →  #\SPACE

Функция CHAR-UPCASE

char-upcase character → corresponding-character CLHS

Переводит character в верхний регистр, если это буква, или возвращает неизменным.

Примеры
(char-upcase #\щ)  →  #\Щ

Функция GRAPHIC-CHAR-P

graphic-char-p char → generalized-boolean CLHS

Возвращает истину если char имеет графическое представление. Пробел #\Space считается графическим, т.к. занимает знакоместо.

Примеры
(graphic-char-p #\Щ)              →  T
(graphic-char-p #\Space)          →  T
(graphic-char-p #\Newline)        →  NIL
(graphic-char-p (code-char 130))  →  NIL

Функция MAKE-STRING

make-string size → string CLHS

Создаёт строку длины size из пробелов:

Примеры
(make-string 5)  →  "     "

Функция STRING

string x → string CLHS

Превращает x в строку:

Примеры
(string 'elm)  →  "ELM"
(string #\c)   →  "c"

функция STRINGP

stringp object → generalized-boolean CLHS

Возвращает истину если object - строка.

Примеры

(stringp "a") → T

(stringp #\a) → NIL


Функция STRING=

string= string1 string2 → generalized-boolean CLHS

Возвращает истину если string1 и string2 одинаковые, т.е. состоят из characters, одиннаковых по функции char=..

Сравнение case-sensitive.

Примеры

(string= "Abc" "ABC")NIL


Функция STRING/=

string/= string1 string2 → generalized-boolean CLHS

Возвращает истину если string1 и string2 разные.

Сравнение case-sensitive.

Примеры

(string/= "Abc" "ABC")T


Функция STRING-EQUAL

string-equal string1 string2 → generalized-boolean CLHS

Возвращает истину если string1 и string2 одинаковые, т.е. состоят из characters, одиннаковых по функции char-equal.

Сравнение case-insensitive.

Примеры

(string-equal "Abc" "ABC")T


Функция STRING-UPCASE

string-upcase string → cased-string CLHS

Создаёт строку в верхнем регистре из string.

Примеры

(string-upcase "Здравствуй МИР!")"ЗДРАВСТВУЙ МИР!"


Функция STRING-DOWNCASE

string-downcase string → cased-string CLHS

Создаёт строку в нижнем регистре из string.

Примеры

(string-downcase "Hello World!")"hello world!"


Функция NSTRING-UPCASE

nstring-upcase string → string CLHS

Приводит string к верхнему регистру. Модифицирующая операция.


Функция NSTRING-DOWNCASE

nstring-downcase string → string CLHS

Приводит string к нижнему регистру. Модифицирующая операция.

Примеры

(setq str (copy-seq "0123ABCD890a"))"0123ABCD890a"

(nstring-downcase str)"0123abcd890a"

str"0123abcd890a"


Символы

Символы могут "интернированными" или свободными. Интернированные принадлежат глобальному списку oblist.

Свободные символы могут быть созданы функциями make-symbol или unintern и удалены при сборке мусора если на них не осталось ссылок.

Lisp reader видит только интернированные символы.


Функция BOUNDP

boundp symbol → generalized-boolean CLHS

Возвращает истину, если к symbol привязано значение в глобальном окружении.

boundp игнорирует лексически-связанные переменные.

Примеры
(boundp 'pi)                   →  T
(boundp 'abc)                  →  NIL
(setq abc 1)                   →  1
(boundp 'abc)                  →  T
(let ((lex 1)) (boundp 'lex))  →  NIL

Функция MAKUNBOUND

makunbound symbol → symbol CLHS

Отвязывает от symbol значение, если таковое было привязано.

Примеры
(setq a 1)       →  1
(boundp 'a)      →  T
(makunbound 'a)  →  A
(boundp 'a)      →  NIL

Оператор DEFPARAMETER

defparameter name initial-value → name CLHS

Создаёт глобальную переменную с именем name, если такой еще не было.

В отличие от defvar всегда вычисляет initial-value и присваивает результат переменной name.

Примеры
(defparameter p (+ 2 3)) →  P
p                        →  5
(defparameter p 10)      →  P
p                        →  10

Оператор DEFVAR

defvar name &optional initial-value → name CLHS

Создаёт глобальную переменную с именем name, если такой еще не было

.

Если переменная name не имеет привязанного значения в глобальном окруженнии, вычисляет initial-value и присваивает результат переменной name.

Если initial-value отсутсвует, оставляет значение name как есть, но переводит переменную в глобальные.

Примеры
(defvar a (+ 2 3))  →  A
a                   →  5
(defvar a 10)       →  A
a                   →  5

Функция FBOUNDP

fboundp name → generalized-boolean CLHS

Возвращает истину, если к sname ymbol привязана функция или оператор.

Примеры
(fboundp 'car)  →  #<SYSTEM-FUNCTION CAR>

Функция FMAKUNBOUND

fmakunbound name → symbol CLHS

Отвязывает от name функцию или оператор, если таковые были привязаны.

Примеры
(fboundp 'asin)      →  #<SYSTEM-FUNCTION ASIN>
(fmakunbound 'asin)  →  ASIN
(fboundp 'asin)      →  NIL

Функция FIND-SYMBOL

find-symbol string &optional package-designator → symbol CLHS

Возвращает интернированный символ с именем string. Если такой не найден - возвращает NIL.

Эта операция case-sensitive.

Если package-designator - символ KEYWORD, то символ ищется среди keyword-ов.БК-0011МRT-11

Примеры
(find-symbol "list")  →  NIL
(find-symbol "LIST")  →  LIST

Функция GENSYM

gensym &optional x → new-symbol CLHS

Создаёт и возвращает неинтернированный символ с именем, состоящим из перфикса и суффикса.

Если x - строка, она становится префиксом, а суффексом становится значение целого из переменной *gensym-counter*. После чего переменная инкрементируется.

Если x - целое, оно становится суффиксом имени, а префикс "G".

Если x не задано, то префикс "G", а суффикс берется из *gensym-counter*.

Примеры
(progn
 (setq *gensym-counter* 10)
 (gensym "PRE"))            →  #:PRE10
*gensym-counter*            →  11
(gensym 50)                 →  #:G50
(gensym)                    →  #:G11

CLHS

Переменная *GENSYM-COUNTER*

Неотрицательное целое, используемое для именования очередного символа функцией gensym.

Примеры
(progn
 (setq *gensym-counter* 10)
 (gensym))                   →  #:G10

Функция KEYWORDP

keywordp object → bool CLHSБК-0011МRT-11

Возвращает истину если object - keyword.

Примеры
(keywordp :abc)  →  T
(keywordp 1)  →  NIL

Функция INTERN

intern string &optional package-designator → symbol CLHS

Создаёт интернированный символ с именем string если такого ещё нет в глобальном списке символов oblist.

Возвращает найденный или созданный символ.

Эта операция case-sensitive.

Если package-designator - символ KEYWORD, то символ ищется среди keyword-ов.БК-0011МRT-11

Примеры
(eq 'list (intern "LIST"))          →  T
(intern "list")                     →  list
(eq (intern "abc") (intern "ABC"))  →  NIL

Функция UNINTERN

unintern symbol → generalized-boolean CLHS

Противоположность функции intern. Удаляет symbol из глобального списка oblist. Он становится недоступным для Reader-а.

Возвращает истину если symbol был в oblist.

Примеры
(unintern 'machine-type)      →  T
(find-symbol "MACHINE-TYPE")  →  NIL

Функция MAKE-SYMBOL

make-symbol name → symbol CLHS

Создаёт и возвращает новый неинтернированный символ с именем name (строка). В отличие от операций чтения символов, имя не преобразуется к верхнему регистру.

Примеры
(make-symbol "AbC")  →  #:AbC

Функция SYMBOL-NAME

symbol-name symbol → name CLHS

Возвращает имя символа.


Функция SYMBOLP

symbolp object → generalized-boolean CLHS

Возвращает истину если object - символ.

Примеры

(symbolp 'a) → T

(symbolp "a") → NIL


Аксессор SYMBOL-FUNCTION

symbol-function symbol → contents (setf (symbol-function symbol) new-value) → new-value
CLHS

Возвращает/присваивает функциональный объект привязанные к symbol.

Если symbol привязан (fbound) к функции, возвращает эту функцию.

Если symbol привязан к специальному оператору или макро, возвращает объект соответствующего типа.

Примеры

(symbol-function 'sin)#<SYSTEM-FUNCTION SIN>

(setf (symbol-function 'twice) #'(lambda (x) (list x x)))


Функция SYMBOL-PLIST

symbol-plist symbol → plist CLHS

Список свойств символа.


Аксессор SYMBOL-VALUE

symbol-function symbol → value
(setf (symbol-value symbol) new-value) → new-value
CLHS

Возвращает/присваивает глобальное значение символа symbol.

Игнорирует лексические переменные.

Примеры
(setf (symbol-value 'a) 1)       →  1
(let ((a 2)) a)	                 →  2
(let ((a 2)) (symbol-value 'a))  →  1

Оператор PUSH

push item place → new-place-value CLHS

Добавляет item в список хранимый в place, сохраняет результат в place и возвращает его.

Эквивалент
(push item place)(setf place (cons item place))

Но отличается порядком вычисления аргументов

Примеры
(setq lst '(1))  →  (1)
(push 'a lst)    →  (A 1)
lst              →  (A 1)

Оператор POP

pop place → element CLHS

Операция, обратная push.

Извлекает car из списка в place и возвращает его, сохраняя cdr этого списка обратно в place.

Эквивалент
(pop item place)(prog1 (car place) (setf place (cdr place)))
Примеры
(pop (setq stack '(a b c))  →  A
stack                       →  (B C)

Оператор ROTATEF

rotatef symbol* → nil CLHS

Циклический сдвиг (ротация) значений переменных symbols.

Первой переменной присваивается значение второй, второй переменной - значение третьей и т.д.. Последней переменной присваивается значение первой.

Примеры
(progn
  (setq a 1 b 2 c 3)
  (rotatef a b c)
  (list a b c))       →  (2 3 1)

Функция SET

set symbol value → value CLHS

Присваивает глобальное значение символа symbol.

Эквивалент
(set symbol value)(setf (symbol-value symbol) value)
Примеры
(set 'a 1) → 1

Оператор SETF

setf {pair}* → result CLHS

pair::= var form

Присваивание переменной var значения вычисленной формы form.

place может быть символом или Аксессором.

Примеры
(setq x (cons 'a 'b) y (list 1 2 3))  →  (1 2 3)
(setf (car x) 'x (nth 1 y) (car x))   →  X
x                                     →  (X . B)
y                                     →  (1 X 3)

Оператор SETQ

setq {pair}* → result CLHS

pair::= place form

Модифицирует величину, хранящуюся в месте place на значение вычисляемой формы form. Возвращает значение form из последней пары.

Примеры

(setq a 1 b 2 c 3) → 3

b → 2


Оператор PSETQ

psetq {pair}* → nil CLHS

pair::= var form

Присваивание переменной var значения вычисленной формы form.

Похоже на setq, но присваивания выполняются параллельнл.

Примеры
(psetq a 1 b 2)            →  nil
(psetq a (1+ b) b (1+ a))  →  nil
(list a b)		           →  (3 2)

Аксессор GET

get symbol indicator &optional default → value
(setf (get symbol indicator) new-value) → new-value
CLHS

get находит свойство indicator в свойствах символа symbol и возвращает его значение. Если свойство не найдено, возвращает default (по умолчанию NIL).

setf get устанавливает свойство indicator в свойствах символа symbol в значение new-value (по умолчанию NIL).

Примеры
(setf (get 'a 'prop) 1)  →  1
(get 'a 'prop)           →  1

Функция GETF

getf plist indicator &optional default → value CLHS

Находит свойство indicator в plist и возвращает его значение. Если свойство не найдено, возвращает default (по умолчанию NIL).

Примеры

(getf '(a 1 b 2 c 3) 'd 5) → 5


Функция REMPROP

remprop symbol indicator → generalized-boolean CLHS

Удаляет из списка свойств symbol свойство с ключём indicator. Возвращает true если такое свойство было в списке.

Примеры
(setf (get 'a 'prop) 1)
(remprop 'a 'prop)       → T

Функция SYMBOL-PLIST

symbol-plist symbol → plist CLHS

Список свойств символа.


Числа

Функция +

+ &rest numbers → sum CLHS

Возвращает сумму слагаемых numbers.

Если слагаемых нет, возвращает 0.

Примеры
(+)          →  0
(+ 1)        →  1
(+ 1 2 3 4)  →  10

Функция -

- number → negation
- minuend &rest subtrahends+ → difference CLHS

С одним аргументом number возвращает противоположное число -number.

С несколькими аргументами вычитает все вычитаемые subtrahends из уменьшаемого minuend и возвращает результат.

Примеры
(- 55.55)       →  -55.55
(- 0)           →  0
(- 10 1 2 3 4)  →  0

Функция *

* &rest numbers → product CLHS

Возвращает произведение множителей numbers.

Если множителей нет, возвращает 1.

Примеры
(*)           →  1
(* 3)         →  3
(* 1 0 2)     →  0
(* 1 -2 3 4)  →  -24

Функция /

/ number → reciprocal
/ numerator &rest denominators+ → quotient CLHS

С одним аргументом number возвращает обратное число 1/number.

С несколькими аргументами делит делимое numerator на все делители denominators и возвращает результат.

При делении на 0 возникает ОШИБКА 11.

Примеры
(/ 0.5)         →  2
(/ 20 5)        →  4
(/ 60 -2 3 5.0) →  -2
(/ 1 0 3)       →  ОШИБКА 11

Функция 1+

1+ number → successor CLHS

Возвращает число, на единицу большее аргумента.

Эквивалент
(1+ number)(+ number 1)
Примеры

(1+ 23) → 24


Функция 1-

1- number → predecessor CLHS

Возвращает число, на единицу меньшее аргумента.

Эквивалент
(1- number)(- number 1)

Оператор INCF

incf place &optional (delta-form 1) → new-value CLHS

Прибавляет к переменной place значение вычесленной формы delta-form (по-умолчанию 1), записывает результат обратно в переменную и возвращает его.

Примеры
(progn (setq n 0)
       (incf n))       → 1
(list (incf n 4.6) n)  → (5.6 5.6)

Оператор DECF

decf place &optional (delta-form 1) → new-value CLHS

Вычитает из переменной place значение вычесленной формы delta-form (по-умолчанию 1), записывает результат обратно в переменную и возвращает его.

Примеры
(progn (setq n -2)
       (list (decf n -5) (decf n))  →  (3 2)

Функции сравнения чисел =, /=, <, >, <=, >=

= &rest numbers+ → generalized-boolean
/= &rest numbers+ → generalized-boolean
< &rest numbers+ → generalized-boolean
<= &rest numbers+ → generalized-boolean
> &rest numbers+ → generalized-boolean
>= &rest numbers+ → generalized-boolean
CLHS

= Возвращает истину, если все numbers равны.

/= Возвращает истину, если все numbers попарно разные.

< Возвращает истину, если numbers монотонно возрастают.

<= Возвращает истину, если numbers монотонно неубывают.

> Возвращает истину, если numbers монотонно убывают.

>= Возвращает истину, если numbers монотонно невозрастают.

Примеры
(= 3 3)         →  T
(/= 3 4 3)      →  NIL
(/= 3 4 5)      →  T
(< -4 3 6)      →  T
(> 4 3 3 2 0)   →  NIL
(>= 4 3 3 2 0)  →  T

Функция ABS

abs number → |number| CLHS

Возвращает модуль (абсолютную величину).

Функция ASH

ash integer count → shifted-integer CLHS

Выполняет арифметический сдвиг integer в двоичной системе на count позиций. Если count положительно - влево, иначе вправо.

Примеры
(ash 3 4)   →  48
(ash 5 -1)  →  2

Функция EXP

exp number → enumber CLHS

Вычисляет экспоненту.

Примеры
(exp 0)        →  1
(exp (log 5))  →  4.9999999999999806

Функция EXPT

expt base-number power-number → base-numberpower-number CLHS

Возводит base-number в степень power-number. Вычисления производятся через логарифм даже для целых показателей, поэтому не точны.

Эквивалент
(expt x y)(exp (* (log x) y))
Примеры
(expt 4 0.5)  →  1.9999999999999984

Функция LOG

log number &optional (base e) → logbase number CLHS

Вычисляет логарифм number, по основанию base. Если base не задано, вычисляется натуральный логарифм (по основанию e).

Обратная функция к exp.

Эквивалент
(log base number)(/ (log number) (log base))
Примеры
(log 1)       →  0
(log 100 10)  →  2

Функция FLOAT

float number → float CLHS

Преобразует действительное число number в тип float.

Примеры

(type-of (float (length #(1)))) → FLOAT


Функция FLOAT-RADIX

float-radix float → 2 CLHSБК-0011МRT-11

Возвращает основание системы счисления, в которой представлено число float. Это всегда 2.


Функция FLOATP

floatp object → generalized-boolean CLHS

Возвращает истину если object - число с плавающей запятой.

В BkLisp числа за исключением редких случаев (например результат функции length) представляются как FLOAT.

Примеры
(floatp 1.5)                →  T
(floatp "1")                →  NIL
(floatp (length #(1 2 3)))  →  NIL

Функция INTEGERP

integerp object → generalized-boolean CLHS

Возвращает истину если object - целое число.

В BkLisp семантика integerp отличается от Common Lisp. Так как нет типа для представления длинных целых, целым кроме FIXNUM считается FLOAT с нулевой дробной частью.

Примеры

(integerp (+ 0.5 0.5))T ; несовместимость с CL


Функция NUMBERP

numberp object → generalized-boolean CLHS

Возвращает истину если object - число. В BkLisp - синоним функции realp.

Примеры

(numberp 3.14) → T


Функция REALP

realp object → generalized-boolean CLHS

Возвращает истину если object - действительное число. В BkLisp все числа действительные.

Примеры

(realp (length #(1 2 3))) → T


Константа PI

pi → 3.1415926535897932 CLHS

Приближение числа π.


Функция SCALE-FLOAT

scale-float float integer → float × 2integer CLHSБК-0011МRT-11

Умножает аргумент float на 2 в степени integer. Если integer отрицательно, то делит на (2-integer).

Эта операция точная, так как меняет только порядок в двоичном представлении числа.

Примеры
(scale-float 1.0 1)     →  2
(scale-float 10.01 -2)  →  2.5025

Тригонометрические функции SIN, COS, TAN, ASIN, ACOS, ATAN

sin radians → sin radians (синус) CLHS

cos radians → cos radians (косинус) CLHS

tan radians → tg radians (тангенс) CLHS

asin number → arcsin number (арксинус в радианах) CLHS

acos number → arccos number (арккосинус в радианах) CLHS

atan number → arctg number (артангенс в радианах) CLHS


Гиперболические функции SINH, COSH, TANH

sinh number → sh number (гиперболический синус) CLHS

cosh number → ch number (гиперболический косинус) CLHS

tanh number → th number (гиперболический тангенс) CLHS

Примеры
(sinh 0.5)  →  .52109530549374555

Функция SQRT

sqrt number → number CLHS

Вычисляет квадратный корень.

Если аргумент отрицательный, прерывается по ОШИБКА 5.

Примеры
(sqrt 12)  →  3.4641016151377546

Функция ISQRT

isqrt natural → ⌊numberCLHS

Вычисляет целую часть квадратного корня.

Эквивалент
(isqrt x)(floor (sqrt x))
Примеры
(isqrt 12)  →  3

Функция FLOOR

floor number &optional (divisor 1) → ⌊number / divisor⌋, reminder CLHS

Вычисляет целую часть от деления number на divisor в направлении -∞.

Вторым значением возвращает остаток. БК-0011МRT-11

Примеры
(floor 5.9)      →  5
(floor -6.5 2)   →  -4; 1.5

Функция TRUNCATE

truncate number &optional (divisor 1) → integer, reminder CLHS

Вычисляет целую часть от деления number на divisor в направлении нуля.

Вторым значением возвращает остаток. БК-0011МRT-11

Примеры
(truncate 5.9)      →  5
(truncate -6.5 2)   →  -3; -0.5

Функция REM

rem number divisor → remainder CLHS

Вычисляет остаток от деления целых number и divisor.

Примеры

(rem 13 4)1

(rem -13 4)-1


Функция EVENP

evenp integer → generalized-boolean CLHS

Возвращает true если integer чётное.


Функция ODDP

oddp integer → generalized-boolean CLHS

Возвращает true если integer нечётное.


Функция MIN

min &rest reals+ → min-real CLHS

Возвращает наименьшее из чисел reals.

Примеры

(min 1 -3.3 2)-3.3


Функция MAX

max &rest reals+ → max-real CLHS

Возвращает наибольшее из чисел reals.

Примеры

(max 1 -9.1 2)2


Функция MINUSP

minusp number → generalized-boolean CLHS

Возвращает true если number отрицательно (меньше нуля).


Функция PLUSP

plusp number → generalized-boolean CLHS

Возвращает true если number положительно (больше нуля).


Функция SIGNUM

signum number → sgn number CLHS

Математическая функция sgn.

В зависимости от знака number, возвращает одно из чисел: -1, 0, 1.

Эквивалент
(signum x)(if (zerop x) x (/ x (abs x)))
Примеры
(signum -3.4)  →  -1
(signum 0)     →  0

Функция ZEROP

zerop number → generalized-boolean CLHS

Возвращает true если number равно нулю.


Логические функции LOGAND, LOGANDC1, LOGANDC2, LOGEQV, LOGIOR, LOGNAND, LOGNOR, LOGNOT, LOGORC1, LOGORC2, LOGXOR

Эти функции выполняют логические операции побитово над 16-битными словами. CLHS

lognot x → ~x
Логическое НЕ

logand &rest integers → integer
Логическое И, без аргументов возвращает -1 (в бинарнмо представлении все единицы).

logior &rest integers → integer
Логическое ИЛИ, без аргументов возвращает 0.

logxor &rest integers → integer
Логическое Исключающее ИЛИ (XOR), без аргументов возвращает 0.

logeqv &rest integers → integer
Логическое XNOR, без аргументов возвращает -1.

lognand x y x → ~(x & y)
Логическое И-НЕ (NAND).

lognor x y → ~(x | y)
Логическое ИЛИ-НЕ (NOR).

logandc1 mask x → ~mask & x

logandc2 x mask → x & ~mask
Очистка битов по маске

logorc1 mask x → ~mask | x

logorc2 x mask → x | ~mask


Сравнения

Функция EQ

eq x y → generalized-boolean CLHS

Возвращает true если x и y - один и тот же объект.


Функция EQL

eql x y → generalized-boolean CLHS

Возвращает true если выполняется хотя бы одно из условий:

Примеры
(eql 'a 'b) → false
(eql 3.0 3.0) → true

Функция EQUAL

equal x y → generalized-boolean CLHS

Возвращает true если выполняется хотя бы одно из условий:

Примеры
(equal (cons 'a 'b) (cons 'a 'b)) → T

Функция EQUALP

equalp x y → generalized-boolean CLHS

Возвращает true если выполняется хотя бы одно из условий:

Примеры
(equalp #\A #\a) → T

Булева логика

Оператор AND

and form* → result CLHS

Вычисляет по очереди формы из form*, пока не дойдёт до значения ложь(NIL), тогда возвращает NIL.

Если все формы вернули истину, оператор возвращает значение последней формы. Если вызван без аргументов, возвращает T.

Является "ленивым", так как не вычисляет формы, следующие после первой ложной.

Примеры

(and 'A (+ 2 4))6


Оператор OR

or form* → result CLHS

Вычисляет по очереди формы из form*, пока не дойдёт до значения истина(NIL), тогда возвращает значение этой формы.

Если все формы вернули ложь или вызван без аргументов, возвращает NIL.

Является "ленивым", так как не вычисляет формы, следующие после первой истинной.

Примеры

(or nil (+ 2 2) nil 5)4


Типы

Функция COERCE

coerce object result-type → result CLHS

Возвращает объект типа result-type, который является преобразованным object.

Поддерживается только преобразование вектора в список.

Примеры
(coerce #(1 2 3) 'list)  →  (1 2 3)

Функция TYPE-OF

type-of object → typespec CLHS

Возвращает спецификацию типа объекта. В BkLisp это один из символов:
NULL, SYMBOL, FLOAT, INTEGER, VECTOR, CONS, STRING, CHARACTER, SYSTEM-FUNCTION, FUNCTION, SPECIAL-OPERATOR, STREAM, ARRAY,
FILE-STREAM RT-11

Примеры
(type-of "123")  →  STRING
(type-of 12.3)   →  FLOAT

Ввод

CLHS

Переменная *STANDARD-INPUT*

Содержит поток ввода по умолчанию. Начальное значение - ввод из командной строки.


Функция INKEY

inkey → char-p Нестандартная

Возвращает character, соответствующий нажатой клавише, либо NIL, если нажатий не было.

Не блокирует выполнение ожиданием.

Примеры
(inkey)  →  #\Y
(inkey)  →  NIL

Функция LOAD

load filename → generalized-boolean CLHS

Читает и выполняет текстовый файл с именем filename с кодом на LISP.

Ограничение на размер файла: 256 байт, т.к. для чтения используется буфер ввода строки с клавиатуры.

В отличие от стандарта CL, в BkLisp эта функция завершается до выполнения форм из файла, поэтому имеет смысл только при интерактивной работе в REPL.

Примеры
; файл fact.lisp
(defun factorial (a) (if (zerop a) 1 (* a (factorial (1- a)))))

(load "fact.lisp")    →  FACT
(fact 9)              →  362880

Функция MAKE-STRING-INPUT-STREAM

make-string-input-stream string &optional start end → string-stream CLHS

Создаёт поток ввода из под-строки string, заданной ограничителями start, end (по умолчанию вся строка).

Примеры
(read (make-string-input-stream "123"))  →  123

Функция READ

read &optional input-stream eof-error-p eof-value recursive-p → object CLHS

Парсит печатное представление объекта из input-stream и создаёт такой объект. По-умолчанию input-stream - клавиатурный ввод.


Функция PEEK-CHAR

peek-char &optional (peek-type nil) input-stream (eof-error-p T) (eof-value nil) → char CLHS

Возвращает очередной character из потока input-stream, не читая его при этом, т.е. после вызова очередны character в потоке остаётся тот-же.

Примеры
(setq stm (make-string-input-stream "  123"))
(peek-char nil stm)		                      → #\SPACE
(peek-char t stm)		                      → #\1
(peek-char #\3 stm)		                      → #\3

Функция READ-CHAR

read-char &optional input-stream (eof-error-p T) (eof-value nil) → char CLHS

Читает очередной character из потока input-stream.

В ситуации конца потока (EOF): если eof-error-p - ложь, возвращает eof-value, иначе порождает ошибку.

Примеры
(read-char (make-string-input-stream "123"))#\1

Функция UNREAD-CHAR

unread-char char &optional input-stream → nil CLHS

Помещает char обратно в поток input-stream, чтобы он снова оказался следующим character, при чтении.

Может быть вызвана только один раз после успешного вызова read-char со значением char, прочитанным read-char.

Примеры
(setq stm (make-string-input-stream "123"))
(unread-char (read-char stm) stm)
(read-char stm)                             → #\1

Функция READ-DELIMITED-LIST

read-delimited-list char &optional input-stream → list CLHS

Читает объекты из input-stream пока не встретит после объекта character char. Возвращает список прочитанных объектов.

Примеры
(read-delimited-list #\] (make-string-input-stream "1 2 3 ]"))  →  (1 2 3)

Функция INPUT-STREAM-P

input-stream-p object → generalized-boolean CLHS

Возвращает истину если object - поток ввода.

Примеры
(input-stream-p (make-string-input-stream "123"))  →  T

Функция STREAMP

streamp object → generalized-boolean CLHS

Возвращает истину если object типа поток.

Примеры
(streamp *standard-input*)  →  T

Функция Y-OR-N-P

y-or-n-p &optional control &rest arguments → generalized-boolean CLHS

При наличии аругмента control, выводит вопрос, сформированный функцией format из аргументов control и arguments.

После чего ожидает ответа в виде нажатия клавиш Y или N.

Возвращает true если была нажата Y, и NIL если нажата N.

Примеры
(y-or-n-p "Ты перестала пить коньяк по утрам?")  →  Ты перестала пить коньяк по утрам?
                                                 →  Y/N

Вывод

CLHS

Переменная *PRINT-BASE*

Система счисления, используемая для печати целых чисел. Может принимать значения: 2, 8, 10, 16. Начальное значение 10.

Примеры
*print-base*            →  10
(let ((*print-base* 8))
  (print 32766))        →  77776  ; вывод PRINT
                        →  32766  ; результат LET

CLHS

Переменная *PRINT-ESCAPE*

При значении nil не печатаются Escape-characters и кавычки у строк. Начальное значение t.

Для вывода, предназначенного для человека обычно *print-escape* присваивают nil. Для машино-читаемого вывода - t.

Примеры
(let ((*print-escape* nil)) (write "AB"))  →  AB    ; вывод WRITE
                                           →  "AB"  ; результат LET

CLHS

Переменная *PRINT-RADIX*

Если истина, при печати целых выводится спецификатор системы счисления.

Для систем счисления 2, 8 и 16 это соответственно префикс #b, #o и #x. Для системы счисления 10 - суффикс . (десятичная точка).

Начальное значение nil.

Примеры
(let ((*print-radix* t))
  (format nil "~S" 14))   →  "14."

(let ((*print-radix* t)
      (*print-base* 2))
  (format nil "~S" 14))   →  "#b1110"

CLHS

Переменная *STANDARD-OUTPUT*

Содержит поток вывода по умолчанию. Начальное значение - вывод на экран.


Функция FORMAT

format destination control-string &rest args → result CLHS

Форматирует вывод в соответствии с управляющей строкой control-string, используя аргументы args.

destination может быть:

Последовательно печатаются characters из control-string, но если встречается управляющий character ~ (тильда), выбиратся специальный обработчик, в зависимости от следующего за тильдой character:

Примеры
(format t "Hello, World!~%")    →  Hello, World!
                                →  NIL

(format nil "Bin: ~b" 123)      →  "Bin: 1111011"

(format nil "A ~A B" "CC")      →  "A CC B"
(format nil "A ~S B" "CC")      →  "A \"CC\" B"

(length (format nil "A~&~&B"))  →  3
(length (format nil "A~%~%B"))  →  4

Функция PRIN1

prin1 object &optional output-stream → object CLHS

Выводит объект в виде, пригодном для чтения функцией read. На время работы присваивает *print-escape* значение истина.

Эквивалент
(prin1 object stream)  ≡  (let ((*standard-output* stream)
                                (*print-escape* t))
                            (write object))
Примеры
(prin1 #\A)  →  #\A  ; вывод PRIN1
             →  #\A  ; возвращаемое значение

Функция PRINC

princ object &optional output-stream → object CLHS

Выводит объект в виде, по-возможности приспособленным для чтения человеком. На время работы присваивает *print-escape* значение nil.

Эквивалент
(princ object stream)  ≡  (let ((*standard-output* stream)
                                (*print-escape* nil))
                            (write object))
Примеры
(princ #\A)  →  A    ; вывод PRINC
             →  #\A  ; возвращаемое значение

Функция PRINT

print object &optional output-stream → object CLHS

Похожа на prin1, но предваряет печать новой строкой и завершает пробелом.

Эквивалент
(print object stream)  ≡  (prog2 (terpri stream)
                                 (prin1 object stream)
                                 (write-char #\space stream))
Примеры
(prog1 (print 'a) (prin1 2))  →       ; новая строка
                              →  A 2  ; вывод PRINT, пробел, вывод PRIN1
                              →  A    ; возвращаемое значение

Функция FRESH-LINE

fresh-line &optional output-stream → generalized-boolean CLHS

Если есть уверенность, что поток output-stream (по-умолчанию *standard-output*) уже находится в состоянии начала новой строки, то не делает ничего и возвращает nil.

Иначе печатает перевод строки аналогично terpri и возвращает истину.

Примеры
(progn (princ "A")
       (fresh-line)
       (fresh-line)
       (princ "B")
       (fresh-line)) →  A
                     →  B
                     →  #<STREAM> ; возвращаемое значение истина

Функция TERPRI

terpri &optional output-stream → nil CLHS

Выводит character NL (перевод строки) в output-stream (по-умолчанию *standard-output*)


Функция WRITE

write object → object CLHS

Выводит печатное представление object в поток *standard-output* в соответсвии с переменными *print-base* и *print-escape*. Возвращает object.

Это базовая фунция печати объектов, вызываемая из print, prin1, princ.

Примеры
(let ((*print-escape* nil))
  (write "ABC"))             →  ABC
                             →  "ABC" ; возвращаемое значение

Функция WRITE-CHAR

write-char character &optional output-stream → character CLHS

Выводит character в output-stream (по-умолчанию *standard-output*) и возвращает его.

Эта функция базовая, к ней обращаются почти все остальные функции вывода.

Примеры
(write-char #\ю)  →  ю
                  →  #\ю ; возвращаемое значение

Функция WRITE-LINE

write-line string &optional output-stream → string CLHS

Выводит строку string в output-stream (по-умолчанию *standard-output*) аналогично write-string, переводит строку (terpri), и возвращает string.

Примеры
(progn (write-line "AB")
       (write-line "CD")) →  AB
                          →  CD
                          →  "CD" ; возвращаемое значение

Функция WRITE-STRING

write-string string &optional output-stream → string CLHS

Выводит строку string в output-stream (по-умолчанию *standard-output*) и возвращает её.

Примеры
(progn (write-string "AA")
       (write-string "BB"))  →  AABB
                             →  "BB" ; возвращаемое значение

Функция GET-OUTPUT-STREAM-STRING

get-output-stream-string string-output-stream → string CLHS

Возвращает строку, содержащую вывод в поток string-output-stream, созданный функцией make-string-output-stream.


Функция MAKE-STRING-OUTPUT-STREAM

make-string-output-stream → string-stream CLHS

Создаёт поток вывода, направляемый в строку.

По завершении вывода строку можно получить функцией get-output-stream-string.

Примеры
(let ((stm (make-string-output-stream)))
  (write-string "number " stm)
  (prin1 123 stm)
  (get-output-stream-string stm))         →  "number 123"

Файлы

Функции для работы с файловой системой. Доступны только в версии для RT-11.

Ограничение: максимум 8 открытых файлов.

Имена файлов имеют вид [dev:]nnnnnn.ext. Имя файла nnnnnn максимум 6 characters, расширение ext максимум 3 characters. Можно использовать латинские буквы, цифры и $.

При открытии файла выделяется буфер объект размером 524 байт, что может быть невозможно в условиях фрагментированной кучи.

Функция DELETE-FILE

delete-file filespec → T CLHS RT-11

Удаляет файл filespec.

Примеры
(delete-file "test1.tmp")         →  T
(delete-file (open "test2.tmp"))  →  T

Функция CLOSE

close stream → result CLHS

Закрывает поток и возвращаеет T если stream был успешно закрыт.

Примеры
(close (make-string-input-stream "abc"))  →  T

Функция FILE-LENGTH

file-length file-stream → length CLHS RT-11

Возвращает размер файла, привязанного к потоку file-stream, в байтах или NIL если размер не удалось определить.

В системе RT-11 размер кратен 512 байт.

Примеры
(file-length (open "a.txt"))  →  512

Функция FILE-POSITION

file-position stream → position CLHS RT-11

Возвращает текущую позицию в потоке stream или NIL если позиция не известна.

Примеры
(let ((stm (open "a.txt")))
    (read-char stm)
    (read-char stm)
    (file-position stm))		  →  2

Функция OPEN

open filespec &key direction → file-stream CLHS RT-11

Открывает файл с именемfilespec и возвращает файловый поток.

После работы поток должен быть закрыт вызовом close.

Если direction является :OUTPUT, то файл создаётся для записи, существующий файл с таким именем удаляется.

Примеры
(open "a.txt")  →  #<FILE-STREAM "a.txt">

(setq stm (open "b.txt" :direction :output))  →  #<FILE-STREAM "b.txt">
(write-char #\X stm)                          → #\X
(close stm)                                   → T

Функция OPEN-STREAM-P

open-stream-p stream → generalized-boolean CLHS

Возвращает истину если stream - открытый поток.

Примеры
(open-stream-p (make-string-input-stream "abc"))  →  T

Функция PROBE-FILE

probe-file filespec → filename CLHS RT-11

Проверяет существование файла filespec. Если файл найден возвращает его имя, в противном случае NIL.

Примеры
(probe-file "test1.tmp")  →  NIL

Функция RENAME-FILE

rename-file filespec new-name → new-name CLHS RT-11

Переименовывает файла filespec в new-name и возвращает новое имя.

Примеры
(rename-file "a.txt" "b.dat")  →  "b.dat"

Время

Для работы со временем используется аппаратный таймер, на некоторых экземплярах БК-0010.01 он неисправен.

В RT-11 используются системные вызовы.


Функция DECODE-UNIVERSAL-TIME

decode-universal-time universal-time → second, minute, hour, day, month, year, day-of-week, NIL, 0 CLHS RT-11

Преобразует Универсальное время в Земные единицы даты и времени суток: секунды, минуты, час, день, месяц, год, день недели (0 - Понедельник).

Последние два результата: признак летнего времени и часовой пояс. В ОС RT-11 они не учитываются.

Примеры
(decode-universal-time 3869434921)  →  1 ;
                                       2 ;
                                       3 ;
                                       14 ;
                                       8 ;
                                       2022 ;
                                       6 ;           Воскресенье
                                       NIL ;
                                       0 ;

Функция ENCODE-UNIVERSAL-TIME

encode-universal-time second minute hour day month year → integer CLHS RT-11

Возвращает Универсальное время для времени, заданного в second, minute, hour, day, month, year.

Примеры
(encode-universal-time 1 2 3 14 8 2022)  →  3869434921

Функция GET-INTERNAL-REAL-TIME

get-internal-real-time → internal-time CLHS

Возвращает текущее время как целое число внутренних единиц времени, прошедших с момента старта BkLisp.

Для пересчета в секунды следует разделить на internal-time-units-per-second.

Разница между двумя вызовами этой функции позволяет замерить промежуток реального времени (elapsed wall-clock time).

Примеры
(get-internal-real-time)  →  123
(get-internal-real-time)  →  255

Функция GET-DECODED-TIME

get-decoded-time → second, minute, hour, day, month, year, day-of-week, NIL, 0 CLHS RT-11

Возвращает текущее время в Земных единицах даты и времени суток.

Эквивалент
(get-decoded-time) ≡ (decode-universal-time (get-universal-time))
Примеры
(get-decoded-time)  →  7 ;
                       24 ;
                       4 ;
                       14 ;
                       8 ;
                       2022 ;
                       6 ;
                       NIL ;
                       0 ;

Функция GET-UNIVERSAL-TIME

get-universal-time → integer CLHS RT-11

Возвращает текущее время как Универсальное время.

Примеры
(get-universal-time)  →  3868930565

Переменная INTERNAL-TIME-UNITS-PER-SECOND

internal-time-units-per-second → 366 CLHS

Частота тиков таймера. Значение по-умолчанию рассчитано на частоту процессора 3 MHz: 3_000_000 / 128 / 64.

Если ваш процессор работает на другой частоте, для правильной работы (time form) надо поменять эту переменную:

;; CL-несовместимость, в CL internal-time-units-per-second - константа
(setq internal-time-units-per-second (/ 6000000 128 64))

Функция SLEEP

sleep seconds → nil CLHS

Приостанавливает выполнение программы на seconds секунд (которое должно быть положительным целым).


Оператор TIME

time form → result CLHS

Замеряет и печатает время выполнения формы form.

Возвращает результат выполнения form.

Примеры
(time (* 1 2 3 4))
                       51 ms
                    →  24

Генератор случайных чисел

Так как в БК-0010.01 отсутствует надёжный источник случайности, генерируемые числа псевдо-случайны. Их нельзя использовать для криптографических целей.

Переменная *RANDOM-STATE*

CLHS

Текущее состояние ГСЧ, используемое если функция random вызвана без явного указания аргумента random-state.


Функция MAKE-RANDOM-STATE

make-random-state &optional (state nil) → random-state CLHS

Создаёт новый объект состояния ГСЧ (в BkLisp представляется типом (CONS FLOAT FLOAT)). Его последующая модификация функцией random не влияет на оригинал state.

Примеры
(setq rs (make-random-state nil))			; clone *random-state*
(random 100)     →  34.854692961087769
(random 100)     →  50.090201930138307
(random 100 rs)  →  34.854692961087769

Функция RANDOM

random limit &optional (random-state *random-state*) → random-number CLHS

Возвращает псевдослучайное число в диапазоне [0, limit).

Его значение определяется состоянием random-state (по-умолчанию переменная random-state), которое модифицируется.

Примеры
(setq rs (make-random-state nil))			; клонируем *random-state*
(random 100)     →  34.854692961087769
(random 100)     →  50.090201930138307
(random 100 rs)  →  34.854692961087769      ; повторно получаем то же число, т.к. используем клон *random-state* из первого шага

Системное окружение


Функция LISP-IMPLEMENTATION-TYPE

lisp-implementation-type → "Ufasoft BkLisp" CLHS

Функция LISP-IMPLEMENTATION-VERSION

lisp-implementation-version → "2023.2" CLHS

Функция MACHINE-TYPE

machine-type → "PDP-11" CLHS

Функция MACHINE-VERSION

machine-version → string CLHS
Примеры
(machine-version)  →  "БК-0010.01"

Функция SOFTWARE-TYPE

software-type → "RT-11" CLHS RT-11

Возвращает название операционной системы.


Функция SOFTWARE-VERSION

software-version → string CLHS RT-11

Возвращает версию операционной системы.

Примеры
(software-version)  →  5.0"

Функция QUIT

нестандартная quit → MONITOR prompt

Выход из BkLisp в командную строку операционной системы МОНИТОР БК-0010.01


Функция ROOM

room → unknown CLHS

Собирает мусор и выводит количество свободной памяти.

Память может быть фрагментирована, не гарантируется аллокация строк и массивов, даже если суммарное количество свободной бамяти больше запрашиваемого размера.


Функция EXTROOM

нестандартная extroom → unknown

Переключает в режим расширенной памяти если уже не в нём и вызывает room.


Переменная *ARGS*

*args* → список аргументов командной строки нестандартная RT-11

При загрузке BkLisp разбивает командную строку на части, разделённые пробеласми, и сохраняет в *args*.

Примеры
(defun main () (print *args*))	  →  MAIN
(save "hello.sav" 'main)          →  T
(quit)

.RUN HELLO new year 2023			             →  ("new" "year" "2023")

Функция SAVE

save filename &optional main-function → generalized-boolean нестандартная

Сохраняет образ памяти BkLisp в файл с именем filename.

Этот образ можно загрузить из монитора БК командой M filename и продолжить работу. Функции и глобальные переменные будут иметь те же значения, что при сохранении.

Если задан аргумент main-function типа символ, то при загрузке автоматически выполняется функция с этим именем, после чего программа завершается.

В RT-11 создаётся стандартный выполнимый .SAV-файл.

Примеры
(defun main ()
  (princ "Здравствуй, Мир!")
  (read-char))                                             ; ожидание нажатия ENTER
                                  →  MAIN

(save "hello.sav" 'main)          →  T                     ; для RT-11
(save "hello.bin" 'main)          →  T                     ; для БК
(quit)

.RUN HELLO                        →  Здравствуй, Мир!      ; для RT-11

-? M
-ИМЯ? hello.bin                   →  Здравствуй, Мир!      ; для БК

Интерактивный цикл Чтение-Вычисление-Печать REPL

Переменные +, ++, +++

CLHS БК-0011МRT-11

+ хранит форму, которую REPL вычислял последней.

++ хранит форму, которую REPL вычислял предпоследней (предыдущее значение +)

+++ хранит предыдущее значение ++.

Примеры
(+ 0 1)          →  1
(- 4 2)          →  2
(/ 9 3)          →  3
(list + ++ +++)  →  ((/ 9 3) (- 4 2) (+ 0 1))

Переменная -

CLHS БК-0011МRT-11

Хранит форму, вычисляемую в данный момент REPL.

Примеры
(list -)        →  ((LIST -))

Переменные *, **, ***

CLHS БК-0011МRT-11

* хранит значение последнего результата, напечатанного REPL.

** хранит предыдущее значение *, т.е. предпоследнего результата REPL.

*** хранит предыдущее значение **.

Примеры
(+ 4 5)  →  9
(+ 1 2)  →  3
*        →  3
***      →  9

Переменные /, //, ///

CLHS БК-0011МRT-11

+ хранит список значений последнего вычесленного результата после их печати в REPL.

++ хранит список значений предпоследнего вычесленного результата после их печати в REPL (предыдущее значение /).

+++ предыдущее значение //.

Примеры
(floor 22 7)                →  3 ;
                               1
(+ (* (car /) 7) (cadr /))  →  22

Функция PEEK

нестандартная peek address → int16

Читает 16-битное целое по адресу address.


Функция POKE

нестандартная poke address int16 → int16

Записывает 16-битное целое int16 по адресу address и возвращает его.

Работа с функциями


Оператор DEFUN

defun function-name lambda-list form* → function-name CLHS

Определяет функцию с именем function-namel, аргументами lambda-list и телом form*.

Список аргументов имеет ту же структуру, что в операторе lambda.

Defun может использоваться и для переопределения уже существующийх функций.

Функция может рекурсивно вызывать себя.

Тело функции заключается в неявный block с именем символа из function-name в качестве метки (если имя (setf foo) то метка блока foo).

Примеры
(defun factorial (x)
  (if (zerop x)
    1
    (* x (factorial (1- x)))))  →  FACTORIAL

(factorial 13)                  →  6227020800

Оператор LAMBDA

lambda lambda-list form* → function-name CLHS

Определяет анонимную функцию (или замыкание) с аргументами lambda-list и телом form*.

Список аргументов lambda-list

Представляет собой список аргументов вида:

(   var*
    [&optional {var | (var init-form)}*]                      CLHS
    [&rest var]                                               CLHS
    [&key {var | (var init-form)}*]                           CLHS  БК-0011МRT-11
    [&aux {var | (var init-form)}*]                           CLHS  БК-0011МRT-11
)


.

Переменные после &optional необязательные. Если при вызове отсутствует аргумент, переменная привязывается к значению вычисляемой init-form.

Переменная после &rest привязывается к списку аргументов, оставшихся после обработки обязательных и необязательных.

Переменные после &key необязательные. Если при вызове отсутствует аргумент, переменная привязывается к значению вычисляемой init-form. БК-0011МRT-11

Переменные после &aux не вляются аргументами, это эквивалент let*. БК-0011МRT-11

Примеры
(defun adder (n)
  (lambda (x) (+ x n)))  →  ADDER
(setq add (adder 5))     →  #<FUNCTION>   ; (adder 5) вернул функцию одного аргумента, прибавляющую к нему 5
(funcall add 7)          →  12

(defun bar (a &optional b (c (+ 2 2)) &rest d &key k)
  (list a b c d k))                             →  BAR
(bar 1)                                         →  (1 NIL 4 NIL NIL)
(bar 1 2 3 :k 9)                                →  (1 2 3 (:K 9) 9)

Константа CALL-ARGUMENTS-LIMIT

call-arguments-limit → 50
CLHS БК-0011МRT-11

Верхняя исключающая граница количества аргументов при вызове функции.


Константа LAMBDA-PARAMETERS-LIMIT

lambda-parameters-limit → 50 CLHS БК-0011МRT-11

Верхняя исключающая граница количества параметров у lambda-list.


Функция APPLY

apply function &rest args+ → result CLHS

Применяет function к args.

Последний аргумент из args сам должен быть списком (отличие от функции funcall, это позволяет вызывать функции с переменным числом аргументов.


Функция FDEFINITION

fdefinition function-name → definition CLHS

Возвращает определение функции или оператора по имени function-name.

Выбрасывает ОШИБКА 18 если функция не определена.

Примеры
(fdefinition 'tan)         →  #
(fdefinition '(setf car))  →  #
(fdefinition 'if)          →  #

Функция FUNCALL

funcall function &rest args → result CLHS

Применяет function к args.

В отличие от функции apply, на вход function поступает столько же аргументов сколько элементов в args.


Оператор FUNCTION

function function name → function CLHS

Возвращает объект-фцнкцию привязанную к имени name.

Можно использовать сокращённый синтаксис: #'name.

Примеры
(function 'exp)  →  #<SYSTEM-FUNCTION EXP>
#'sin            →  #<SYSTEM-FUNCTION SIN>

Функция FUNCTIONP

functionp object → generalized-boolead CLHS

Возвращает истину если object имеет тип функции: FUNCTION или SYSTEM-FUNCTION.

Примеры
(functionp #'sin)          →  T
(functionp 'sin)           →  NIL
(functionp (lambda (a) a)) →  T

Функция IDENTITY

identity object → object CLHS

Возвращает аргумент object.

Предназначена для использования с функциями высшего порядка(принимающими аргумент-функцию).


Функция EVAL

eval form → result CLHS

Вычисляет form в пустом лексическом окружении.


Оператор QUOTE

quote quote object → object CLHS

Возвращает object.

Позволяет передавать константные само-вычисляемые объекты (списки и символы) как аргументы функции, предотвращая их вычисление.

Можно использовать сокращённый синтаксис: 'object.

Примеры
(quote (+ 1 2))  →  (+ 1 2)
'a               →  A
(list '(+ 1 2))  →  ((+ 1 2))

Функция MAPC

mapc function &rest lists+ → list-1 CLHS

Похожа на mapcar, но не накапливает результаты, а возвращает первый список из lists.

Примеры
(let (dummy)
  (list
    (mapc #'(lambda (&rest x) (setq dummy (append dummy x)))
      '(1 2 3 4)
      '(a b c d e)
      '(x y z))
    dummy))                                                   →  ((1 2 3 4) (1 A X 2 B Y 3 C Z))

Функция MAPCAR

mapcar function &rest lists+ → result-list CLHS

Применяет функцию function сначала к первым елементам каждоко из списков lists, затем ко вторым и т.д.

Итерация прекращается при достижении конца самого короткого из lists.

Возвращает список результатов применения function.

Примеры
(mapcar #'cons '(a b c) '(1 2 3 4))  →  ((A . 1) (B . 2) (C . 3))

Функция REDUCE

reduce function list → result CLHS

Применяет бинарную функцию function слева направо к элементам list.

Если list пустой, возвращает результат вызова function без аргументов.

В отличие от CL, где reduce можно применять к любой последовательности, BkLisp поддерживает только списки.

Примеры
(reduce #'* '(1 2 3 4 5))   →  120
(reduce #'list '(1 2 3 4))  →  (((1 2) 3) 4)

Функция SPECIAL-OPERATOR-P

special-operator-p symbol → generalized-boolean CLHS

Возвращает истину если symbol - специальный оператор.

Примеры

(special-operator-p 'if)T

(special-operator-p 'car)NIL


Управление выполнением

Оператор BLOCK

block name form* → result CLHS

Выполняет form* внутри блока с лексически-видимой меткой name (символ).

Позволяет выйти из блока с помощью операторов return или return-from.

Примеры
(block early (return-from early 1) 2)  →  1

Оператор RETURN

return &optional (result nil) → result CLHS

Возвращает вычисленный result из лексически-видимого блока с меткой NIL.

Эквивалент
(return form) ≡ (return-from nil form)
Примеры
(block nil (block alpha (return 1) 2))  →  1

Оператор RETURN-FROM

return-from name &optional (result nil) → result CLHS

Возвращает вычисленный result из лексически-видимого блока с меткой name (не вычисляется).

Примеры
(block alpha (return-from alpha) 1)  →  NIL

Функция ERROR

error datum → CLHS

Печатает ОШИБКА datum и прерывает выполнение программы с выходом в REPL.

Примеры
(if nil "OK" (error "Условие нарушено"))  → ОШИБКА "Условие нарушено"

Оператор GO

go tag → CLHS

Передаёт управление в точку tag оператора tagbody.


Оператор TAGBODY

tagbody {tag | statement}* → nil CLHS

Выполняет формы statement в лексическом окружении, которое позволяет передать управлние на метку tag оператором go.


Оператор COND

cond {clause}* → result
clause ::= (test-form form*) CLHS

Выбирает какие группы forms выполнить в зависимости от условий test-form.

Формы test-form выполняются по-порядку до первой вернувшей истину. После этого выполняются forms, соответствующие этой test-form и результат последней возвращается. Если их нет - возвращает результат самой test-form.

Вычисления прекращаются после первой истины. При её отсутствии возвращает NIL.

Примеры
(cond ((< 1 2) 'a) ((> 3 4) 'b) (t 'c)))  → A
(cond ((< 2 1) 'a) (nil 'b) (t 'c)))      → C

Оператор IF

if test-form then-form [else-form] → result CLHS

Else-form - форма. По-умолчанию nil

Сначала вычисляется test-form. Если результат - истина, то выбирается then-form, иначе else-form. Выбранная форма вычисляется.

При отсутствии else-form она считается NIL.

Эквивалент
(if test-form then-form else-form) ≡ (cond (test-form then-form) (t else-form))
Примеры
(if t 1)     → 1
(if nil 1 2) → C

Оператор WHEN

when test-form form* → result CLHS

Если test-form вычисляется в истину формы forms вычисляются по порядку слева-направо и значение последней формы возвращается.

Иначе forms не вычисляются и возвращается NIL.

Эквивалент
(when test {form}+) ≡ (if test (progn {form}+))
Примеры
(when t (prin1 1) (prin1 2) (prin1 3))    → 123  ; побочный эффект
                                            3    ; результат

(when nil (prin1 1) (prin1 2) (prin1 3))  → NIL

Оператор UNLESS

unless test-form form* → result CLHS

Противоположность оператору when.

Если test-form вычисляется в ложь формы forms вычисляются по порядку слева-направо и значение последней формы возвращается.

Иначе forms не вычисляются и возвращается NIL.

Эквивалент
(unless test {form}+) ≡ (when (not test) {form}+)
Примеры
(unless nil (prin1 1) (prin1 2) (prin1 3))  →  123   ; побочный эффект
                                               3       ; результат

(unless t (prin1 1) (prin1 2) (prin1 3))    →  NIL

Операторы DO, DO*

do ({var | (var [init-form [step-form]])}*) (end-test-form result-form*) statement* → result
do* ({var | (var [init-form [step-form]])}*) (end-test-form result-form*) statement* → result
CLHS

Выполняет итерации statements пока не выполнится условие окончaния цикла end-test-form, после чего выполняются result-form* и результат последней возвращается.

Перед итерациями связываются переменные var. Они инициализируются значениями init-form или nil. После каждой итерации обновляются значениями форм step-form, если они есть.

DO инициализирует и обновляет переменные паралельно, аналогично let и psetq.

DO* инициализирует и обновляет переменные последовательно, аналогично let* и setq.

DO, DO* выполняются в неявном блоке с меткой NIL. Можно вернуть результат из любоко места оператором return.

Примеры
(do ((temp-one 1 (1+ temp-one))
     (temp-two 0 (1+ temp-one)))
  ((= 3 temp-two) temp-one))      →  3

(do* ((temp-one 1 (1+ temp-one))
      (temp-two 0 (1+ temp-one)))
  ((= 3 temp-two) temp-one))      →  2

Оператор DOLIST

dolist (var list-form [result-form]) {statements} → result CLHS

Выполняет итерации statements для каждого элемента списка list-form. Переменная var при этом привязана к очередному элементу списка.

Возвращает результат выполнения result-form (по-умолчанию nil).

DOLIST выполняется в неявном блоке с меткой NIL. Можно вернуть результат из любоко места оператором return.

Примеры
(let (r)
  (dolist (a '(1 2 3) r)
    (push a r)))          →  (3 2 1)

Оператор DOTIMES

dotimes (var count-form [result-form]) {statements} → result CLHS

Выполняет итерации statements count-form раз. Переменная var при этом привязана к номеру элемента начиная с 0.

Возвращает результат выполнения result-form (по-умолчанию nil).

DOTIMES выполняется в неявном блоке с меткой NIL. Можно вернуть результат из любоко места оператором return.

Примеры
(dotimes (n 3 n)
  (print n))      →  0
                  →  1
                  →  2
                  →  3  ; результат

Оператор LET

let ({var | (var [init-form])}*) form* → result CLHS

Привязывет символы var к значениям вычисленных init-form. В полученном окружении (лексическом или динамическом в зависимости от символов var) выполняет forms и возвращает результат последней.

Присваивания выполняются параллельно.

Примеры
(setq a '1)
(let ((a 2)
      (b a))
  (list a b))  →  (2 1)

Оператор LET*

let* ({var | (var [init-form])}*) form* → result CLHS

Похоже на let, но присваивания выполняются последовательно. Каждая очередная init-form видит значения предыдущих привязок из этого же оператора let.

Примеры
(setq a '1)
(let ((a 2)
      (b a))
  (list a b))  →  (2 2)

Оператор PROG1

prog1 first-form form* → result-1 CLHS

Вычисляет first-form, запоминает результат, и возвращает его после выполнения остальных форм form*.

Примеры
(prog1 'A 'B (prin1 1) 'D)      →  1   ; побочный эффект
                                →  A   ; результат

Оператор PROG2

prog2 first-form second-form form* → result-2 CLHS

Вычисляет first-form, затем second-form запоминает результат second-form, и возвращает его после выполнения остальных форм form*.

Примеры
(prog2 'A 'B (prin1 1) 'D)      →  1   ; побочный эффект
                                →  B   ; результат

Оператор PROGN

progn form* → result CLHS

progn выполняет forms по очереди и возвращает результат последней.

Многие конструкции в Lisp заканчиваются неявным progn: let, defun.

Примеры
(progn 1 2 3)  →  3

Оператор PROGV

progv symbols values form* → result CLHS

Вычисляет списки symbols и values. Динамически привязывает символы из symbols к значениям из values. Выполняет forms в этом динамическом окружении и возвращает результат последней из forms.

Не влияет на лексически-привязанные переменные.

Примеры
(let ((*x* 3))
  (progv '(*x*) '(4)
    (list *x* (symbol-value '*x*))))  →  (3 4)

Отладка

Оператор TRACE

trace function-name* → trace-result CLHS БК-0011МRT-11

Включает трассировку функций с именами function-name* и возвращает список этих имён.

Если вызван без аргументов, возвращает список имён всех трассируемых функций.

Примеры
(trace sin)                            →  (SIN)

(defun fact (x)
  (if (<= x 1) 1 (* x (fact (1- x))))) →  FACT
(trace fact sin)                        →  (FACT)
(trace)                                 →  (SIN FACT)

(fact 3)
 FACT <- (3)
  FACT <- (2)
   FACT <- (1)
   FACT -> 1
  FACT -> 2
 FACT -> 6
                                        →  6
(untrace)                               →  (SIN FACT)
(fact 4)                                →  24


Оператор UNTRACE

untrace function-name* → trace-result CLHS БК-0011МRT-11

Отключает трассировку функций с именами function-name* и возвращает список этих имён.

Если вызван без аргументов, отключает трассировку всех функций.


Коды ошибок

Коды ошибок совпадают по смыслу с кодами БЕЙСИК, когда возможно.

ОШИБКА 1 - Переполнение стека.

ОШИБКА 2 - Синтаксическая ошибка.

ОШИБКА 5 - Неверный аргумент функции, например (SQRT -1).

ОШИБКА 6 - Арифметическое переполнение.

ОШИБКА 7 - Нехватка памяти.

ОШИБКА 9 - Индекс за пределами размера вектора или строки.

ОШИБКА 11 - Деление на 0.

ОШИБКА 13 - Ошибка типов, неожиданный тип аргумента функции.

ОШИБКА 14 - Неопределённая ошибка.

ОШИБКА 15 - Попытка создать строку длиннее 255 characters.

ОШИБКА 16 - Недопустимая размерность массива

ОШИБКА 18 function-name - Неопределённая функция.

ОШИБКА 19 - Ошибка Ввода/Вывода (файловой операции).
Канал занятRT-11

ОШИБКА 20 - Файл не найден или аппаратная ошибка RT-11

ОШИБКА 21 - Канал не открыт (при чтении) RT-11

ОШИБКА 22 - Файл защищён (при удалении или переименовании) RT-11

ОШИБКА 25 - Переполнение буфера ввода. Попытка ввести строку длиннее 255 characters.

Литература

Conrad Barski 2010 Land of LISP: Learn to Program in LISP, One Game at a Time Интересная книжка с весёлыми картинками
Kent Pitman 1996 Common Lisp HyperSpec (CLHS) Справочник по стандарту
Paul Graham 1995 ANSI Common Lisp Подходит в качестве учебника, но выходит за пределы возможностей BkLisp
Paul Graham 1993 On Lisp Для углубленного изучения языка
Guy L. Steel Jr. 1990 Common Lisp the Language, 2nd Edition Этот текст лёг в основу стандарта
Hasemer 1984 Looking at Lisp Описаны реализации LISP для микрокомпьютеров 1980-х годов, подходит для изучения BkLisp
David S. Touretzky 1984 LISP: A Gentle Introduction to Symbolic Computation Одна из самых рекомендуемых книг для начинающих

Индекс символов

&AUX &KEY &OPTIONAL &REST * функция * переменная ** *** *ARGS* *GENSYM-COUNTER* *PRINT-BASE* *PRINT-ESCAPE* *PRINT-RADIX* *RANDOM-STATE* *STANDARD-INPUT* *STANDARD-OUTPUT* / функция / переменная // /// /= + функция + переменная ++ +++ - функция - переменная = < <= > >= 1+ 1- ABS ACONS ACOS ADJOIN ALPHA-CHAR-P ALPHANUMERICP AND APPEND APPLY AREF ARRAY ARRAY-DIMENSION ARRAY-DIMENSION-LIMIT ARRAY-DIMENSIONS ARRAY-IN-BOUNDS-P ARRAY-RANK ARRAY-RANK-LIMIT ARRAY-ROW-MAJOR-INDEX ARRAY-TOTAL-SIZE ARRAY-TOTAL-SIZE-LIMIT ARRAYP ASIN ASSOC ATAN ATOM BLOCK BOUNDP SYSTEM-FUNCTION BUTLAST CAAR CADR CALL-ARGUMENTS-LIMIT CAR CDAR CDDR CDR CHAR CHAR-CODE CHAR-DOWNCASE CHAR-EQUAL CHAR-INT CHAR-NAME CHAR-UPCASE CHAR= CHAR/= CHARACTER CHARACTERP CLOSE CODE-CHAR COERCE COND CONS CONSP COPY-ALIST COPY-LIST COPY-SEQ COPY-TREE COS COSH DECF DECODE-UNIVERSAL-TIME DEFPARAMETER DEFUN DEFVAR DELETE-FILE DIGIT-CHAR DIGIT-CHAR-P DO DO* DOLIST DOTIMES EIGTHTH ELT ENDP EQ EQL EQUAL EQUALP ENCODE-UNIVERSAL-TIME ERROR EXP EXPT EXTROOM EVAL EVENP FBOUNDP FDEFINITION FIFTH FILE-LENGTH FILE-POSITION FILL FIND-SYMBOL FIRST FLOAT FLOAT-RADIX FLOATP FLOOR FMAKUNBOUND FORMAT FOURTH FRESH-LINE FUNCALL FUNCTION FUNCTIONP GENSYM GET GET-INTERNAL-REAL-TIME GET-OUTPUT-STREAM-STRING GET-DECODED-TIME GET-UNIVERSAL-TIME GETF GO GRAPHIC-CHAR-P IDENTITY IF INCF INKEY INPUT-STREAM-P INTEGER INTEGERP INTERN INTERNAL-TIME-UNITS-PER-SECOND INTERSECTION ISQRT KEYWORDP LAMBDA LAMBDA-PARAMETERS-LIMIT LAST LDIFF LENGTH LET LET* LISP-IMPLEMENTATION-TYPE LISP-IMPLEMENTATION-VERSION LIST LIST* LIST-LENGTH LISTIFY LISTP LOAD LOG LOGAND LOGANDC1 LOGANDC2 LOGEQV LOGIOR LOGNAND LOGNOR LOGNOT LOGORC1 LOGORC2 LOGXOR MACHINE-TYPE MACHINE-VERSION MAKE-ARRAY MAKE-LIST MAKE-RANDOM-STATE MAKE-SEQUENCE MAKE-STRING MAKE-STRING-INPUT-STREAM MAKE-STRING-OUTPUT-STREAM MAKE-SYMBOL MAKUNBOUND MAPC MAPCAR MAX MEMBER MIN MINUSP MULTIPLE-VALUE-LIST MULTIPLE-VALUES-LIMIT NAME-CHAR NCONC NIL NINTH NOT NREVERSE NSTRING-DOWNCASE NSTRING-UPCASE NTH NTHCDR NTH-VALUE NULL NUMBERP ODDP OPEN OPEN-STREAM-P OR PAIRLIS PEEK PEEK-CHAR PI PLUSP POKE POP PRIN1 PRINC PRINT PROBE-FILE PROG1 PROG2 PROGN PROGV PSETQ PUSH QUIT QUOTE RANDOM RASSOC READ READ-CHAR READ-DELIMITED-LIST REALP REDUCE REM REMOVE REMPROP RENAME-FILE REST RETURN RETURN-FROM REVERSE ROOM ROTATEF ROW-MAJOR-AREF RPLACA RPLACD SAVE SCALE-FLOAT SECOND SET SET-DIFFERENCE SETF SETQ SEVENTH SIGNUM SIMPLE-VECTOR-P SIN SINH SIXTH SLEEP SOFTWARE-TYPE SOFTWARE-VERSION SPECIAL-OPERATOR SPECIAL-OPERATOR-P SQRT STREAM STREAMP STRING STRINGP STRING-DOWNCASE STRING-EQUAL STRING-UPCASE STRING= STRING/= SUBSETP SUBST SVREF SYMBOL-FUNCTION SYMBOL-NAME SYMBOL-PLIST SYMBOL-VALUE SYMBOLP T TAGBODY TAILP TAN TANH TENTH TERPRI THIRD TIME TRACE TRUNCATE TYPE-OF UNINTERN UNION UNLESS UNREAD-CHAR UNTRACE VALUES VALUES-LIST VECTOR VECTORP WHEN WRITE WRITE-CHAR WRITE-LINE WRITE-STRING Y-OR-N-P ZEROP