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.
Лицензия
Код выпущен под лицензией MIT.
Допускается свободное использование, копирование и модификация при условии ссылки на оригинал.
Развитие Проекта
Наращивать функциональность на оригинальной платформе БК-0010.01 невозможно, не принося в жертву память, а значит сужая множество программ, способных запуститься. Остаётся путь портирования на другие платформы.
Из-за схожей системы команд, возможно портировать на процессор m68k.
BkLisp - некоммерческий проект. В то же время можно перечислить пожертвования на его развитие:
Отклонения от Common Lisp
- Сравнение букв Кириллицы производится в кодировке КОИ-8-БК, сортировка работает не в алфавитном порядке.
- Десятичные дроби форматируются подпрограммой из БЕЙСИК, например 0.5 представляется в виде .5
- Длина строк ограничена 255 characters.
- Длина идентификаторов и чисел ограничена 31 characters.
Специфика BkLisp для БК-0010.01
- Используются подпрограммы из ПЗУ Бейсик-Вильнюс. В сборке для БК-0011М эти подпрограммы включены в образ BkLisp.
- Операции с целыми числами предполагают 16-битное представление: диапазон -32768..65535. Отрицательные целые перекрываются с положительными и интерпретируются в зависимости от контекста.
- Глубина стека 256 байт. Это позволяет сделать до 14 вложенных вызовов.
- Сборщик мусора использует часть видеопамяти статусной строки во время работы. Поэтому её содержимое портится.
- Клавиша ВС (в RT-11: ↑) повторяет последнюю введённую строку, как в БЕЙСИК.
- Клавиша СТОП (в RT-11: двойной CTRL/C) прерывает выполнение и переводит интерпретатор в начальное состояние (цикл REPL). Значения глобальных переменных и функций при этом сохраняются.
- С помощью вызова
(extroom)
можно переключиться в режим расширенной памяти (+12 KiB). Вернуться из него нельзя, даже выводя код 2148. - Ещё немного памяти можно высвободить, исключая неиспользуемые символы из пространства имён, например
(dolist (sym '(sin cos lisp-implementation-version)) (unintern sym))
Дополнения к возможностям COMMON LISP
- Функция SAVE - Возможность создавать автономные исполнимые файлы: .SAV для RT-11 и .BIN для БК.
- Переменная *ARGS* - Передача аргументов командной строки в RT-11.
- Функции PEEK, POKE - Прямой досту к памяти.
Что реализовано
Функциональность Common Lisp, которая есть в BkLisp, но обычно отсутсвует в минимальных реализациях Lisp:
- Множественные возвращаемые значения (функция VALUES)
- Трассировка, как средство отладки (форма TRACE)
- Keywords
Что НЕ реализовано
Функциональность Common Lisp, которой нет в BkLisp:
- &key аргументы у функций
- Рациональные числа
- Комплексные числа
- Целые неограниченной длины
- Packages
- CLOS
- Conditions
- Pretty Printing
- Readtable
- Filenames
- Структуры
- Хеш-таблицы
- Макросы
- LOOP
- Компилятор
- Сложное форматирование чисел, римская система счисления
При портировании BkLisp на платформы с большим количеством ОЗУ часть этой функциональности может быть реализована.
Справочник
Справа приведены ссылки на CLHS с более полной документацией. В BkLisp реализовано только подмножество функциональности CL, но то что реализовано - совместимо с CL насколько это было возможно при ограничениях платформы.
Терминология
- Аксессор - пара функций для чтения/записи поля. CLHS
- boolean - логическое значение: NIL - Ложь, T - Истина.
- generalized-boolean - логическое значение: NIL - Ложь, все остальные объекты - Истина.
- Правильный список - список, заканчивающийся NIL. CLHS
- dotted-список - список, у которого завершающий атом - не nil. CLHS
- простой вектор - вектор, не являющийся строкой, может содержать объекты любого типа.
- keyword - символ-константа, значением которй является он сам. Синтаксис: :name. CLHS
- sequence - список, простой вектор или строка.
- STDIN - стандартный ввод, клавиатура.
- STDOUT - стандартный вывод, экран.
- Универсальное время - количество секунд с момента 1 Января 1900 года.CLHS
- whitespace - обобщённые пробелы: #\SPACE, #\TAB, #\NEWLINE, #\RETURN.
Синтаксис
Комментарии
CLHS(list '(1 2 3)) ; это однострочный комментарий #| Это Многострочный комментарий |# #| Он также #| Может быть вложенным |# |#CLHS
Characters
CLHSНачинаются с #\
:
#\D
#\Щ
#\9
Есть несколько именованных character:
#\tab
#\space
#\newline
#\return
Типы данных
Тип объекта можно получить вызвав(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Представляет логическое значения ложь, а также пустой список.
Примеры
nil
→ NIL
Константа T
CLHSКаноническое представление логического значения истина.
Хотя любой не-NIL объект представляет истину, когда нет причин представлять её другим объектом, предпочтительно использовать T.
Примеры
t
→ T
Списки
Аксессор 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 и caar x → object CLHS
cons object-1 object-2 → cons
CLHS
Создаёт cons-объект, car которого object-1 и cdr которого object-2.
acons key datum alist → new alist
CLHS
Добавляет cons из key и datum к ассоциатиыному списку alist.
adjoin item list → new-list
CLHS
Если item содержится в list возвращает list, иначе присоединяет item к list с помощью cons и возвращает новый список.
assoc item alist → entry
CLHS
Возвращает первый cons в ассоциативном списке alist, чей car совпадает с item.
rassoc item alist → entry
CLHS
Возвращает первый cons в ассоциативном списке alist, чей cdr совпадает с item.
pairlis keys data &optional alist → new alist
CLHS
Возвращает ассоциативный список, с ключами (car) из keys и величинами (cdr) из data. Cписки keys и data должны быть одинаковой длины. Порядок пар в результате не определён.
В некоторых языках эта функция называется zip.
atom object → generalized-boolean
CLHS
Возвращает истину если object - атом (не cons).
Противоположна функции consp.
consp object → generalized-boolean
CLHS
Возвращает истину если object - cons.
Противоположна функции atom.
listp object → generalized-boolean
CLHS
Возвращает истину если object - список (в том числе пустой).
copy-alist alist → new-alist
CLHS
Клонирует списковую структуру alist. Элементы, являющиеся cons клонируются, остальные объекты попадают в результат как есть.
copy-list list → copy
CLHS
Создаёт копию списка, в том числе dotted-списка.
copy-seq sequence → copied-sequence
CLHS
Создаёт shallow-копию последовательности sequence. Копируется только последовательность, не не её элементы.
Клонирует дерево cons-ячеек.
Если tree - не cons, оно становится результатом, иначе возвращает новый cons, составленный из результатов применения copy-tree к car и cdr этого cons.
rplaca cons object → cons
CLHS
Заменяет car ячейки cons на object.
Заменяет cdr ячейки cons на object.
length sequence → n
CLHS
Вычисляет количество элементов в списке, векторе или строке sequence.
list &rest objects → list
CLHS
Возвращает список объектов objects.
list* &rest objects+ → list
CLHS
Похожа на list за исключением того, что последний аргумент objects становится cdr последней cons-пары результата.
listify x → list
Если x - список, возвращает его, иначе создаёт спис из одного элемента x.
Для правильного списка возвращает его длину. Для циклического - NIL.
make-list size → list
CLHS
Создаёт список длины size (неотрицательное целое), состоящий из nil.
first list → object Возвращают/присваивают соответственно первый, второй и третий элементы списка, если считать с единицы.
nth n list → object Возвращает/присваивает n-ый элемент списка list. Если длина списка меньше или равна n, возвращает NIL.
nthcdr n list → tail
CLHS
Возвращает хвост списка list, получаемый после применения cdr n раз.
reverse sequence → reversed-sequence
CLHS
Возвращает последовательность того же типа что sequence, содержащую элементы sequence в обратном порядке.
Не модифицирует свой аргумент.
nreverse sequence → reversed-sequence
CLHS
Обращает порядок элементов в sequence и возвращает её. В отличие от reverse модифицирует аргумент.
append &rest lists → concatenated-list
CLHS
Возвращает список, являющийся конкатенацией списков lists.
В отличие от nconc списки не модифицируются, а копируются (кроме последнего).
last list &optional (n 1) → tail
CLHS
Возвращает последние n cons-ячеек в списке list. Если list - NIL, возвращает NIL.
Если n = 0, возвращает атом, завершающий list.
Если n ≥ количества cons-ячеек в list, возвращает полный list.
butlastlist &optional (n 1) → result-list
CLHS
Возвращает копию list за исключением последних n cons-ячеек.
Если n > количества cons-ячеек в list, возвращает nil.
Исходный list не модифицируется.
nconc &rest lists → concatenated-list
CLHS
Возвращает список, являющийся конкатенацией списков lists.
Деструктивная операция, все списки кроме последнего модифицируются (cdr последнего cons каждого списка указывает на следующий список).
endp list → boolean
CLHS
Возвращает T если list пустой список NIL. Возвращает NIL, если list - cons.
В остальных случаях выбрасывает ОШИБКА 13.
При переборе списка надёжнее использовать endp, чем null, чтобы поймать cdr, не являющийся списком (случай dotted-list).
null object → boolean
CLHS
Возвращает t если object пустой список, иначе возвращает nil.
Синоним функции not, но применяется со списками.
not x → boolean
CLHS
Возвращает t если x ложь, иначе возвращает nil.
Синоним функции null, но применяется с логическими выражениями.
sort sequence predicate → sorted-sequence
CLHS
Упорядочивает элементы в sequence в соответсвии с предикатом predicate.
Предикат должен возвращать true, если первый аргумент предшествует второму (в произвольном смысле).
Деструктивная операция.
ldiff list object → result-list
CLHS
Если object - хвост list, возвращает список элементов, предшествущих этому хвосту, иначе возвращает копию list.
substr new old tree → new-tree
CLHS
Подменяет в дереве tree листья, совпадающие с old на объект new и возвращает новое дерево.
Недеструктивная операция.
tailp object list → generalized-boolean
CLHS
Проверяет, является ли object хвостом списка list.
Иными словами object совпадает (eql) с list, или с CDR одного из его cons-ячеек.
Ищет в списке list элемент item.
Если находит - возвращает хвост списка, начинающийся с этого элемента, иначе возвращает NIL.
Эту функцию можно отнести к семейству Множества, реализует операцию ∈.
Обычно функция возвращает одно значение. Но может вернуть несколько, в том числе ноль значений.
Первое из значений считается основным. Если функция не возвращает значений, а вызывающий код использует результат, то основное значение NIL.
⚠ Этот раздел действителен только для сборки BkLisp под RT-11.
Возвращает список множественных результатов вычисления form.
Верхняя исключающая граница количества результатов функции.
Возвращает n-й по счёту (начиная с 0) результат вычисления form, или NIL если результатов меньше или равно n.
Возвращает объекты object как множественные значения.
Возвращает элементы list как множественные значения.
Множества представляются списками. Элементы сравниваются функцией eql. Пустое множество ∅ представляется nil.
intersection list-1 list-2 → result-list
CLHS
Пересечение множеств ( ∩ ).
Возвращает список из элементов, принадлежащих каждому из списков list-1 и list-2.
Порядок элементов в результате не определён.
set-difference list-1 list-2 → result-list
CLHS
Разность множеств ( ∖ ).
Возвращает список из элементов list-1, не принадлежащих list-2.
Порядок элементов в результате не определён.
subsetp list-1 list-2 → generalized-boolean
CLHS
Проверка на подмножество ( ⊂ ).
Возвращает true, если каждый элемент list-1 входит и в list-2.
union list-1 list-2 → result-list
CLHS
Объединение множеств ( ∪ ).
Возвращает список из элементов, принадлежащих хотя бы одному из списков list-1 и list-2.
Порядок элементов в результате не определён.
Последовательность - объединяющее название типов: список, вектор и строка.
elt sequence index → object Возвращает/присваивает index-ый элемент последовательности sequence.
Заполняет sequence объектами item.
Создаёт последовательность типа result-type размера size (неотрицательное целое).
result-type должен быть одним из символов: list, string или vector.
Возвращает последовательность sequence из которой удалены все вхождения item. Исходная sequence не модифицируется.
Возвращает axis-number-ую размерность массива array.
Верхняя исключающая граница для каждой размерности массивов.
Может отличаться в разных версиях.
Возвращает список размерностей массива array.
Возвращает истину, если все индексы subscripts находятся в рамках границ массива.
Возвращает ранг (количество размерностей) массива array.
Верхняя исключающая граница ранга (количества размероностей) массивов.
Возвращает позицию элемента array с индексами subscripts односительно начала массива в памяти.
Возвращает общее количество элементов в массиве.
Верхняя исключающая граница общего количества элементов в массиве.
Может отличаться в разных версиях.
arrayp object → generalized-boolean
CLHS
БК-0011МRT-11
Возвращает истину если object - массив.
Векторы и строки - тоже массивы.
make-array dimension → new-array
CLHS
make-array dimensions → new-array БК-0011МRT-11
Создаёт и возвращает массив с размерностями dimensions (список или число).
Если dimensions - число, то создаёт (простой вектор) этого размера, заполненный значением nil.
vectorp object → generalized-boolean
CLHS
Возвращает истину если object - вектор.
Строки являются векторами.
simple-vector-p object → generalized-boolean
CLHS
Возвращает истину если object - простой вектор.
aref array &rest subscripts → element Возвращает/присваевает элемент массива array, определяемый индексами subscripts.
row-major-aref array index → element Возвращает/присваивает index-ый элемент массива array, если рассматривать его как одномерный сегмент памяти.
svref simple-vector index → element Возвращает/присваивает index-ый элемент вектора simple-vector.
Создаёт vector, состоящий из objects.
alpha-char-p char → generalized-boolean
CLHS
Возвращает истину если char - буква.
alphanumericp char → generalized-boolean
CLHS
Возвращает Истину если char - буква или цифра.
Возвращает/присваивает index-ый элемент строки string.
Превращает character-designator в строку:
characterp object → generalized-boolean
CLHS
Возвращает истину если object - character.
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.
Код (неотрицательное целое 0..255) char в кодировке КОИ-8-БК.
В BkLisp синоним функции char-int.
Код (неотрицательное целое 0..255) char в кодировке КОИ-8-БК.
В BkLisp синоним функции char-code.
Возвращает character с кодом code или NIL, если нет соответсвующего character.
Возвращает имя character, если оно существует, иначе NIL.
Возвращает character, чьё имя - name, или NIL, если такого не найдено.
digit-char weight &optional radix → char-or-nil
CLHS
Если weight меньше radix (основание системы счисления, по-умолчанию 10), возвращает character представляющий цифру weight в этой системе счисления.
В случае если это буква, то в верхнем регистре.
Иначе возвращает NIL.
digit-char-p char &optional radix → weight
CLHS
Если char является цифрой в системе счисления radix (по-умолчанию 10), возвращает значение (weight) этой цифры.
Иначе возвращает NIL.
char-downcase character → corresponding-character
CLHS
Переводит character в нижний регистр, если это буква, или возвращает неизменным.
char-upcase character → corresponding-character
CLHS
Переводит character в верхний регистр, если это буква, или возвращает неизменным.
graphic-char-p char → generalized-boolean
CLHS
Возвращает истину если char имеет графическое представление. Пробел #\Space считается графическим, т.к. занимает знакоместо.
Создаёт строку длины size из пробелов:
Превращает x в строку:
stringp object → generalized-boolean
CLHS
Возвращает истину если object - строка.
string= string1 string2 → generalized-boolean
CLHS
Возвращает истину если string1 и string2 одинаковые, т.е. состоят из characters, одиннаковых по функции char=..
Сравнение case-sensitive.
string/= string1 string2 → generalized-boolean
CLHS
Возвращает истину если string1 и string2 разные.
Сравнение case-sensitive.
string-equal string1 string2 → generalized-boolean
CLHS
Возвращает истину если string1 и string2 одинаковые, т.е. состоят из characters, одиннаковых по функции char-equal.
Сравнение case-insensitive.
Создаёт строку в верхнем регистре из string.
Создаёт строку в нижнем регистре из string.
Приводит string к верхнему регистру. Модифицирующая операция.
Приводит string к нижнему регистру. Модифицирующая операция.
Символы могут "интернированными" или свободными. Интернированные принадлежат глобальному списку oblist.
Свободные символы могут быть созданы функциями make-symbol или unintern и удалены при сборке мусора если на них не осталось ссылок.
Lisp reader видит только интернированные символы.
Возвращает истину, если к symbol привязано значение в глобальном окружении.
boundp игнорирует лексически-связанные переменные.
Отвязывает от symbol значение, если таковое было привязано.
Создаёт глобальную переменную с именем name, если такой еще не было.
В отличие от defvar всегда вычисляет initial-value и присваивает результат переменной name.
Создаёт глобальную переменную с именем name, если такой еще не было Если переменная name не имеет привязанного значения в глобальном окруженнии, вычисляет initial-value и присваивает результат переменной name.
Если initial-value отсутсвует, оставляет значение name как есть, но переводит переменную в глобальные.
Возвращает истину, если к sname ymbol привязана функция или оператор.
Отвязывает от name функцию или оператор, если таковые были привязаны.
Возвращает интернированный символ с именем string. Если такой не найден - возвращает NIL.
Эта операция case-sensitive.
Если package-designator - символ KEYWORD, то символ ищется среди keyword-ов.БК-0011МRT-11
Создаёт и возвращает неинтернированный символ с именем, состоящим из перфикса и суффикса.
Если x - строка, она становится префиксом, а суффексом становится значение целого из переменной *gensym-counter*. После чего переменная
инкрементируется.
Если x - целое, оно становится суффиксом имени, а префикс "G".
Если x не задано, то префикс "G", а суффикс берется из *gensym-counter*.
Неотрицательное целое, используемое для именования очередного символа функцией gensym.
Возвращает истину если object - keyword.
Создаёт интернированный символ с именем string если такого ещё нет в глобальном списке символов oblist.
Возвращает найденный или созданный символ.
Эта операция case-sensitive.
Если package-designator - символ KEYWORD, то символ ищется среди keyword-ов.БК-0011МRT-11
unintern symbol → generalized-boolean
CLHS
Противоположность функции intern. Удаляет symbol из глобального списка oblist. Он становится недоступным для Reader-а.
Возвращает истину если symbol был в oblist.
Создаёт и возвращает новый неинтернированный символ с именем name (строка). В отличие от операций чтения символов, имя не преобразуется к верхнему регистру.
Возвращает имя символа.
symbolp object → generalized-boolean
CLHS
Возвращает истину если object - символ.
Возвращает/присваивает функциональный объект привязанные к symbol.
Если symbol привязан (fbound) к функции, возвращает эту функцию.
Если symbol привязан к специальному оператору или макро, возвращает объект соответствующего типа.
Список свойств символа.
Возвращает/присваивает глобальное значение символа symbol.
Игнорирует лексические переменные.
push item place → new-place-value
CLHS
Добавляет item в список хранимый в place, сохраняет результат в place и возвращает его.
Но отличается порядком вычисления аргументов
pop place → element
CLHS
Операция, обратная push.
Извлекает car из списка в place и возвращает его, сохраняя cdr этого списка обратно в place.
rotatef symbol* → nil
CLHS
Циклический сдвиг (ротация) значений переменных symbols.
Первой переменной присваивается значение второй, второй переменной - значение третьей и т.д.. Последней переменной присваивается значение первой.
Присваивает глобальное значение символа symbol.
setf {pair}* → result
CLHS
pair::= var form
Присваивание переменной var значения вычисленной формы form.
place может быть символом или Аксессором.
setq {pair}* → result
CLHS
pair::= place form
Модифицирует величину, хранящуюся в месте place на значение вычисляемой формы form. Возвращает значение form из последней пары.
pair::= var form
Присваивание переменной var значения вычисленной формы form.
Похоже на setq, но присваивания выполняются параллельнл.
get symbol indicator &optional default → value get находит свойство indicator в свойствах символа symbol и возвращает его значение. Если свойство не найдено, возвращает default (по умолчанию NIL).
setf get устанавливает свойство indicator в свойствах символа symbol в значение new-value (по умолчанию NIL).
getf plist indicator &optional default → value
CLHS
Находит свойство indicator в plist и возвращает его значение. Если свойство не найдено, возвращает default (по умолчанию NIL).
remprop symbol indicator → generalized-boolean
CLHS
Удаляет из списка свойств symbol свойство с ключём indicator. Возвращает true если такое свойство было в списке.
Список свойств символа.
Возвращает сумму слагаемых numbers.
Если слагаемых нет, возвращает 0.
С одним аргументом number возвращает противоположное число -number.
С несколькими аргументами вычитает все вычитаемые subtrahends из уменьшаемого minuend и возвращает результат.
Возвращает произведение множителей numbers.
Если множителей нет, возвращает 1.
С одним аргументом number возвращает обратное число 1/number.
С несколькими аргументами делит делимое numerator на все делители denominators и возвращает результат.
При делении на 0 возникает ОШИБКА 11.
Возвращает число, на единицу большее аргумента.
Возвращает число, на единицу меньшее аргумента.
Прибавляет к переменной place значение вычесленной формы delta-form (по-умолчанию 1), записывает результат обратно в переменную и возвращает его.
Вычитает из переменной place значение вычесленной формы delta-form (по-умолчанию 1), записывает результат обратно в переменную и возвращает его.
= &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 монотонно невозрастают.
abs number → |number|
CLHS
Возвращает модуль (абсолютную величину).
ash integer count → shifted-integer
CLHS
Выполняет арифметический сдвиг integer в двоичной системе на count позиций. Если count положительно - влево, иначе вправо.
exp number → enumber
CLHS
Вычисляет экспоненту.
expt base-number power-number → base-numberpower-number
CLHS
Возводит base-number в степень power-number. Вычисления производятся через логарифм даже для целых показателей, поэтому не точны.
log number &optional (base e) → logbase number
CLHS
Вычисляет логарифм number, по основанию base. Если base не задано, вычисляется натуральный логарифм (по основанию e).
Обратная функция к exp.
Преобразует действительное число number в тип float.
Возвращает основание системы счисления, в которой представлено число float. Это всегда 2.
Возвращает истину если object - число с плавающей запятой.
В BkLisp числа за исключением редких случаев (например результат функции length) представляются как FLOAT.
Возвращает истину если object - целое число.
В BkLisp семантика integerp отличается от Common Lisp. Так как нет типа для представления длинных целых, целым кроме FIXNUM считается FLOAT с нулевой дробной частью.
numberp object → generalized-boolean
CLHS
Возвращает истину если object - число. В BkLisp - синоним функции realp.
Возвращает истину если object - действительное число. В BkLisp все числа действительные.
Приближение числа π.
Умножает аргумент float на 2 в степени integer. Если integer отрицательно, то делит на (2-integer).
Эта операция точная, так как меняет только порядок в двоичном представлении числа.
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 number → sh number (гиперболический синус) CLHS
cosh number → ch number (гиперболический косинус) CLHS
tanh number → th number (гиперболический тангенс) CLHS
Вычисляет квадратный корень.
Если аргумент отрицательный, прерывается по ОШИБКА 5.
Вычисляет целую часть квадратного корня.
Вычисляет целую часть от деления number на divisor в направлении -∞.
Вторым значением возвращает остаток. БК-0011МRT-11
truncate number &optional (divisor 1) → integer, reminder
CLHS
Вычисляет целую часть от деления number на divisor в направлении нуля.
Вторым значением возвращает остаток. БК-0011МRT-11
rem number divisor → remainder
CLHS
Вычисляет остаток от деления целых number и divisor.
evenp integer → generalized-boolean
CLHS
Возвращает true если integer чётное.
oddp integer → generalized-boolean
CLHS
Возвращает true если integer нечётное.
min &rest reals+ → min-real
CLHS
Возвращает наименьшее из чисел reals.
max &rest reals+ → max-real
CLHS
Возвращает наибольшее из чисел reals.
minusp number → generalized-boolean
CLHS
Возвращает true если number отрицательно (меньше нуля).
plusp number → generalized-boolean
CLHS
Возвращает true если number положительно (больше нуля).
signum number → sgn number
CLHS
Математическая функция sgn.
В зависимости от знака number, возвращает одно из чисел: -1, 0, 1.
zerop number → generalized-boolean
CLHS
Возвращает true если number равно нулю.
Эти функции выполняют логические операции побитово над 16-битными словами. CLHS
lognot x → ~x
logand &rest integers → integer
logior &rest integers → integer
logxor &rest integers → integer
logeqv &rest integers → integer
lognand x y x → ~(x & y)
lognor x y → ~(x | y)
logandc1 mask x → ~mask & x
logandc2 x mask → x & ~mask
logorc1 mask x → ~mask | x
logorc2 x mask → x | ~mask
eq x y → generalized-boolean
CLHS
Возвращает true если x и y - один и тот же объект.
eql x y → generalized-boolean
CLHS
Возвращает true если выполняется хотя бы одно из условий:
equal x y → generalized-boolean
CLHS
Возвращает true если выполняется хотя бы одно из условий:
equalp x y → generalized-boolean
CLHS
Возвращает true если выполняется хотя бы одно из условий:
and form* → result
CLHS
Вычисляет по очереди формы из form*, пока не дойдёт до значения ложь(NIL), тогда возвращает NIL.
Если все формы вернули истину, оператор возвращает значение последней формы. Если вызван без аргументов, возвращает T.
Является "ленивым", так как не вычисляет формы, следующие после первой ложной.
or form* → result
CLHS
Вычисляет по очереди формы из form*, пока не дойдёт до значения истина(NIL), тогда возвращает значение этой формы.
Если все формы вернули ложь или вызван без аргументов, возвращает NIL.
Является "ленивым", так как не вычисляет формы, следующие после первой истинной.
coerce object result-type → result
CLHS
Возвращает объект типа result-type, который является преобразованным object.
Поддерживается только преобразование вектора в список.
type-of object → typespec
CLHS
Возвращает спецификацию типа объекта. В BkLisp это один из символов: Содержит поток ввода по умолчанию. Начальное значение - ввод из командной строки.
inkey → char-p
Нестандартная
Возвращает character, соответствующий нажатой клавише, либо NIL, если нажатий не было.
Не блокирует выполнение ожиданием.
load filename → generalized-boolean
CLHS
Читает и выполняет текстовый файл с именем filename с кодом на LISP.
Ограничение на размер файла: 256 байт, т.к. для чтения используется буфер ввода строки с клавиатуры.
В отличие от стандарта CL, в BkLisp эта функция завершается до выполнения форм из файла, поэтому имеет смысл только при интерактивной работе в REPL.
make-string-input-stream string &optional start end → string-stream
CLHS
Создаёт поток ввода из под-строки string, заданной ограничителями start, end (по умолчанию вся строка).
read &optional input-stream eof-error-p eof-value recursive-p → object
CLHS
Парсит печатное представление объекта из input-stream и создаёт такой объект.
По-умолчанию input-stream - клавиатурный ввод.
peek-char &optional (peek-type nil) input-stream (eof-error-p T) (eof-value nil) → char
CLHS
Возвращает очередной character из потока input-stream, не читая его при этом, т.е. после вызова очередны character в потоке остаётся тот-же.
read-char &optional input-stream (eof-error-p T) (eof-value nil) → char
CLHS
Читает очередной character из потока input-stream.
В ситуации конца потока (EOF): если eof-error-p - ложь, возвращает eof-value, иначе порождает ошибку.
Помещает char обратно в поток input-stream, чтобы он снова оказался следующим character, при чтении.
Может быть вызвана только один раз после успешного вызова read-char со значением char, прочитанным read-char.
Читает объекты из input-stream пока не встретит после объекта character char. Возвращает список прочитанных объектов.
Возвращает истину если object - поток ввода.
Возвращает истину если object типа поток.
y-or-n-p &optional control &rest arguments → generalized-boolean
CLHS
При наличии аругмента control, выводит вопрос, сформированный функцией format из аргументов control и arguments.
После чего ожидает ответа в виде нажатия клавиш Y или N.
Возвращает true если была нажата Y, и NIL если нажата N.
Система счисления, используемая для печати целых чисел. Может принимать значения: 2, 8, 10, 16. Начальное значение 10.
При значении nil не печатаются Escape-characters и кавычки у строк. Начальное значение t.
Для вывода, предназначенного для человека обычно Если истина, при печати целых выводится спецификатор системы счисления.
Для систем счисления 2, 8 и 16 это соответственно префикс #b, #o и #x. Для системы счисления 10 - суффикс . (десятичная
точка).
Начальное значение nil.
Содержит поток вывода по умолчанию. Начальное значение - вывод на экран.
format destination control-string &rest args → result
CLHS
Форматирует вывод в соответствии с управляющей строкой control-string, используя аргументы args.
destination может быть:
Последовательно печатаются characters из control-string, но если встречается управляющий character ~ (тильда), выбиратся специальный обработчик, в зависимости от следующего
за тильдой character:
prin1 object &optional output-stream → object
CLHS
Выводит объект в виде, пригодном для чтения функцией read. На время работы присваивает *print-escape* значение истина.
princ object &optional output-stream → object
CLHS
Выводит объект в виде, по-возможности приспособленным для чтения человеком. На время работы присваивает *print-escape* значение nil.
print object &optional output-stream → object
CLHS
Похожа на prin1, но предваряет печать новой строкой и завершает пробелом.
fresh-line &optional output-stream → generalized-boolean
CLHS
Если есть уверенность, что поток output-stream (по-умолчанию *standard-output*) уже находится в состоянии начала новой строки, то не делает ничего и возвращает nil.
Иначе печатает перевод строки аналогично terpri и возвращает истину.
terpri &optional output-stream → nil
CLHS
Выводит character NL (перевод строки) в output-stream (по-умолчанию *standard-output*)
write object → object
CLHS
Выводит печатное представление object в поток *standard-output* в соответсвии с переменными *print-base* и
*print-escape*. Возвращает object.
Это базовая фунция печати объектов, вызываемая из print, prin1, princ.
write-char character &optional output-stream → character
CLHS
Выводит character в output-stream (по-умолчанию *standard-output*) и возвращает его.
Эта функция базовая, к ней обращаются почти все остальные функции вывода.
write-line string &optional output-stream → string
CLHS
Выводит строку string в output-stream (по-умолчанию *standard-output*) аналогично write-string, переводит строку (terpri), и возвращает string.
write-string string &optional output-stream → string
CLHS
Выводит строку string в output-stream (по-умолчанию *standard-output*) и возвращает её.
get-output-stream-string string-output-stream → string
CLHS
Возвращает строку, содержащую вывод в поток string-output-stream, созданный функцией make-string-output-stream.
make-string-output-stream → string-stream
CLHS
Создаёт поток вывода, направляемый в строку.
По завершении вывода строку можно получить функцией get-output-stream-string.
Функции для работы с файловой системой. Доступны только в версии для RT-11.
Ограничение: максимум 8 открытых файлов.
Имена файлов имеют вид [dev:]nnnnnn.ext. Имя файла nnnnnn максимум 6 characters, расширение ext максимум 3 characters. Можно использовать
латинские буквы, цифры и $.
При открытии файла выделяется буфер объект размером 524 байт, что может быть невозможно в условиях фрагментированной кучи.
Удаляет файл filespec.
Закрывает поток и возвращаеет T если stream был успешно закрыт.
Возвращает размер файла, привязанного к потоку file-stream, в байтах или NIL если размер не удалось определить.
В системе RT-11 размер кратен 512 байт.
Возвращает текущую позицию в потоке stream или NIL если позиция не известна.
Открывает файл с именемfilespec и возвращает файловый поток.
После работы поток должен быть закрыт вызовом close.
Если direction является :OUTPUT, то файл создаётся для записи, существующий файл с таким именем удаляется.
Возвращает истину если stream - открытый поток.
Проверяет существование файла filespec. Если файл найден возвращает его имя, в противном случае NIL.
Переименовывает файла filespec в new-name и возвращает новое имя.
Для работы со временем используется аппаратный таймер, на некоторых экземплярах БК-0010.01 он неисправен.
В RT-11 используются системные вызовы.
Преобразует Универсальное время в Земные единицы даты и времени суток: секунды, минуты, час, день, месяц, год, день недели (0 - Понедельник).
Последние два результата: признак летнего времени и часовой пояс. В ОС RT-11 они не учитываются.
Возвращает Универсальное время для времени, заданного в second, minute, hour, day, month, year.
Возвращает текущее время как целое число внутренних единиц времени, прошедших с момента старта BkLisp.
Для пересчета в секунды следует разделить на internal-time-units-per-second.
Разница между двумя вызовами этой функции позволяет замерить промежуток реального времени (elapsed wall-clock time).
Возвращает текущее время в Земных единицах даты и времени суток.
Возвращает текущее время как Универсальное время.
Частота тиков таймера. Значение по-умолчанию рассчитано на частоту процессора 3 MHz: Если ваш процессор работает на другой частоте, для правильной работы Приостанавливает выполнение программы на seconds секунд (которое должно быть положительным целым).
Замеряет и печатает время выполнения формы form.
Возвращает результат выполнения form.
Текущее состояние ГСЧ, используемое если функция random вызвана без явного указания аргумента random-state.
Создаёт новый объект состояния ГСЧ (в BkLisp представляется типом (CONS FLOAT FLOAT)). Его последующая модификация функцией random не влияет на оригинал state.
Возвращает псевдослучайное число в диапазоне [0, limit).
Его значение определяется состоянием random-state (по-умолчанию переменная random-state), которое модифицируется.
Возвращает название операционной системы.
Возвращает версию операционной системы.
Выход из BkLisp в командную строку операционной системы МОНИТОР БК-0010.01
Собирает мусор и выводит количество свободной памяти.
Память может быть фрагментирована, не гарантируется аллокация строк и массивов, даже если суммарное количество свободной бамяти больше запрашиваемого размера.
Переключает в режим расширенной памяти если уже не в нём и вызывает room.
*args* → список аргументов командной строки
нестандартная
RT-11
При загрузке BkLisp разбивает командную строку на части, разделённые пробеласми, и сохраняет в *args*.
save filename &optional main-function → generalized-boolean
нестандартная
Сохраняет образ памяти BkLisp в файл с именем filename.
Этот образ можно загрузить из монитора БК командой M filename и продолжить работу. Функции и глобальные переменные будут иметь те же значения, что при
сохранении.
Если задан аргумент main-function типа символ, то при загрузке автоматически выполняется функция с этим именем, после чего программа завершается.
В RT-11 создаётся стандартный выполнимый .SAV-файл.
+ хранит форму, которую REPL вычислял последней.
++ хранит форму, которую REPL вычислял предпоследней (предыдущее значение +)
+++ хранит предыдущее значение ++.
Хранит форму, вычисляемую в данный момент REPL.
* хранит значение последнего результата, напечатанного REPL.
** хранит предыдущее значение *, т.е. предпоследнего результата REPL.
*** хранит предыдущее значение **.
+ хранит список значений последнего вычесленного результата после их печати в REPL.
++ хранит список значений предпоследнего вычесленного результата после их печати в REPL (предыдущее значение /).
+++ предыдущее значение //.
Читает 16-битное целое по адресу address.
Записывает 16-битное целое int16 по адресу address и возвращает его.
defun function-name lambda-list form* → function-name
CLHS
Определяет функцию с именем function-namel, аргументами lambda-list и телом form*.
Список аргументов имеет ту же структуру, что в операторе lambda.
Defun может использоваться и для переопределения уже существующийх функций.
Функция может рекурсивно вызывать себя.
Тело функции заключается в неявный block с именем символа из function-name в качестве метки (если имя (setf foo) то метка блока foo).
lambda lambda-list form* → function-name
CLHS
Определяет анонимную функцию (или замыкание) с аргументами lambda-list и телом form*.
Представляет собой список аргументов вида:
Переменные после &optional необязательные. Если при вызове отсутствует аргумент, переменная привязывается к значению вычисляемой init-form.
Переменная после &rest привязывается к списку аргументов, оставшихся после обработки обязательных и необязательных.
Переменные после &key необязательные. Если при вызове отсутствует аргумент, переменная привязывается к значению вычисляемой init-form. БК-0011МRT-11
Переменные после &aux не вляются аргументами, это эквивалент let*. БК-0011МRT-11
Верхняя исключающая граница количества аргументов при вызове функции.
Верхняя исключающая граница количества параметров у lambda-list.
apply function &rest args+ → result
CLHS
Применяет function к args.
Последний аргумент из args сам должен быть списком (отличие от функции funcall, это позволяет вызывать функции с переменным числом аргументов.
fdefinition function-name → definition
CLHS
Возвращает определение функции или оператора по имени function-name.
Выбрасывает ОШИБКА 18 если функция не определена.
funcall function &rest args → result
CLHS
Применяет function к args.
В отличие от функции apply, на вход function поступает столько же аргументов сколько элементов в args.
function function name → function
CLHS
Возвращает объект-фцнкцию привязанную к имени name.
Можно использовать сокращённый синтаксис: functionp object → generalized-boolead
CLHS
Возвращает истину если object имеет тип функции: FUNCTION или SYSTEM-FUNCTION.
identity object → object
CLHS
Возвращает аргумент object.
Предназначена для использования с функциями высшего порядка(принимающими аргумент-функцию).
eval form → result
CLHS
Вычисляет form в пустом лексическом окружении.
quote quote object → object
CLHS
Возвращает object.
Позволяет передавать константные само-вычисляемые объекты (списки и символы) как аргументы функции, предотвращая их вычисление.
Можно использовать сокращённый синтаксис: mapc function &rest lists+ → list-1
CLHS
Похожа на mapcar, но не накапливает результаты, а возвращает первый список из lists.
mapcar function &rest lists+ → result-list
CLHS
Применяет функцию function сначала к первым елементам каждоко из списков lists, затем ко вторым и т.д.
Итерация прекращается при достижении конца самого короткого из lists.
Возвращает список результатов применения function.
reduce function list → result
CLHS
Применяет бинарную функцию function слева направо к элементам list.
Если list пустой, возвращает результат вызова function без аргументов.
В отличие от CL, где reduce можно применять к любой последовательности, BkLisp поддерживает только списки.
special-operator-p symbol → generalized-boolean
CLHS
Возвращает истину если symbol - специальный оператор.
Выполняет form* внутри блока с лексически-видимой меткой name (символ).
Позволяет выйти из блока с помощью операторов return или return-from.
Возвращает вычисленный result из лексически-видимого блока с меткой NIL.
Возвращает вычисленный result из лексически-видимого блока с меткой name (не вычисляется).
Печатает ОШИБКА datum и прерывает выполнение программы с выходом в REPL.
Передаёт управление в точку tag оператора tagbody.
Выполняет формы statement в лексическом окружении, которое позволяет передать управлние на метку tag оператором go.
cond {clause}* → result Выбирает какие группы forms выполнить в зависимости от условий test-form.
Формы test-form выполняются по-порядку до первой вернувшей истину. После этого выполняются forms, соответствующие этой test-form и результат последней возвращается. Если их нет - возвращает
результат самой test-form.
Вычисления прекращаются после первой истины. При её отсутствии возвращает NIL.
if test-form then-form [else-form] → result
CLHS
Else-form - форма. По-умолчанию nil
Сначала вычисляется test-form. Если результат - истина, то выбирается then-form, иначе else-form. Выбранная форма вычисляется.
При отсутствии else-form она считается NIL.
when test-form form* → result
CLHS
Если test-form вычисляется в истину формы forms вычисляются по порядку слева-направо и значение последней формы возвращается.
Иначе forms не вычисляются и возвращается NIL.
unless test-form form* → result
CLHS
Противоположность оператору when.
Если test-form вычисляется в ложь формы forms вычисляются по порядку слева-направо и значение последней формы возвращается.
Иначе forms не вычисляются и возвращается NIL.
do ({var | (var [init-form [step-form]])}*) (end-test-form result-form*) statement* → result Выполняет итерации statements пока не выполнится условие окончaния цикла end-test-form, после чего выполняются result-form* и результат последней возвращается.
Перед итерациями связываются переменные var. Они инициализируются значениями init-form или nil. После каждой итерации обновляются значениями форм step-form, если они есть.
DO инициализирует и обновляет переменные паралельно, аналогично let и psetq.
DO* инициализирует и обновляет переменные последовательно, аналогично let* и setq.
DO, DO* выполняются в неявном блоке с меткой NIL. Можно вернуть результат из любоко места оператором return.
dolist (var list-form [result-form]) {statements} → result
CLHS
Выполняет итерации statements для каждого элемента списка list-form. Переменная var при этом привязана к очередному элементу списка.
Возвращает результат выполнения result-form (по-умолчанию nil).
DOLIST выполняется в неявном блоке с меткой NIL. Можно вернуть результат из любоко места оператором return.
dotimes (var count-form [result-form]) {statements} → result
CLHS
Выполняет итерации statements count-form раз. Переменная var при этом привязана к номеру элемента начиная с 0.
Возвращает результат выполнения result-form (по-умолчанию nil).
DOTIMES выполняется в неявном блоке с меткой NIL. Можно вернуть результат из любоко места оператором return.
let ({var | (var [init-form])}*) form* → result
CLHS
Привязывет символы var к значениям вычисленных init-form. В полученном окружении (лексическом или динамическом в зависимости от символов var) выполняет
forms и возвращает результат последней.
Присваивания выполняются параллельно.
let* ({var | (var [init-form])}*) form* → result
CLHS
Похоже на let, но присваивания выполняются последовательно. Каждая очередная init-form видит значения предыдущих привязок из этого же оператора let.
prog1 first-form form* → result-1
CLHS
Вычисляет first-form, запоминает результат, и возвращает его после выполнения остальных форм form*.
prog2 first-form second-form form* → result-2
CLHS
Вычисляет first-form, затем second-form запоминает результат second-form, и возвращает его после выполнения остальных форм form*.
progn form* → result
CLHS
progn выполняет forms по очереди и возвращает результат последней.
Многие конструкции в Lisp заканчиваются неявным progn: let, defun.
progv symbols values form* → result
CLHS
Вычисляет списки symbols и values. Динамически привязывает символы из symbols к значениям из values. Выполняет forms в этом динамическом
окружении и возвращает результат последней из forms.
Не влияет на лексически-привязанные переменные.
Включает трассировку функций с именами function-name* и возвращает список этих имён.
Если вызван без аргументов, возвращает список имён всех трассируемых функций.
Отключает трассировку функций с именами function-name* и возвращает список этих имён.
Если вызван без аргументов, отключает трассировку всех функций.
ОШИБКА 1 - Переполнение стека.
ОШИБКА 2 - Синтаксическая ошибка.
ОШИБКА 5 - Неверный аргумент функции, например (SQRT -1).
ОШИБКА 6 - Арифметическое переполнение.
ОШИБКА 7 - Нехватка памяти.
ОШИБКА 9 - Индекс за пределами размера вектора или строки.
ОШИБКА 11 - Деление на 0.
ОШИБКА 13 - Ошибка типов, неожиданный тип аргумента функции.
ОШИБКА 14 - Неопределённая ошибка.
ОШИБКА 15 - Попытка создать строку длиннее 255 characters.
ОШИБКА 16 - Недопустимая размерность массива
ОШИБКА 18 function-name - Неопределённая функция.
ОШИБКА 19 - Ошибка Ввода/Вывода (файловой операции).
ОШИБКА 20 - Файл не найден или аппаратная ошибка RT-11
ОШИБКА 21 - Канал не открыт (при чтении) RT-11
ОШИБКА 22 - Файл защищён (при удалении или переименовании) RT-11
ОШИБКА 25 - Переполнение буфера ввода. Попытка ввести строку длиннее 255 characters.
Примеры
(cdr '(1 . 2)) → 2
Функции CAAR, CDAR, CADR, CDDR
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
Функция ACONS
Эквивалент
(acons key datum alist) ≡ (cons (cons key datum) alist)
Функция ADJOIN
Эквивалент
(adjoin item list) ≡ (if (member item list) list (cons item list))
Функция ASSOC
Функция RASSOC
Функция PAIRLIS
Если задан alist, то новые пары добавляются к нему.
Примеры
(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
Функция CONSP
Функция LISTP
Эквивалент
(listp x) ≡ (or (null x) (consp x))
Примеры
(listp (cons 1 2))
→ T
Функция COPY-ALIST
Примеры
(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
Примеры
(setq lst '(1 2 . 3))
→
(copy-list lst)(1 2 . 3)
(eq (copy-list lst) lst)
→ NIL
Функция COPY-SEQ
Функция COPY-TREE
copy-tree tree → new-tree
CLHS
Функция RPLACA
Примеры
(setq a '(a . b ))
→ (A . B)
(rplaca a 'c)
→ (C . B)
a
→ (C . B)
Побочные эффекты
Модифицирует cons.
Функция RPLACD
rplacd cons object → cons
CLHS
Примеры
(rplacd '(1 2 3) 'tail)
→ (1 . TAIL)
Побочные эффекты
Модифицирует cons.
Функция LENGTH
Примеры
(length '(1 2 3))
→ 3
(length #())
→ 0
(length "Lisperati")
→ 9
Функция LIST
Примеры
(list 1 2 3)
→ (1 2 3)
Функция LIST*
Примеры
(list* 1 2 3)
→ (1 2 . 3)
Функция LISTIFY
нестандартная
Примеры
(listify 1) → (1)
(listify '(1)) → (1)
Функция LIST-LENGTH
list-length list → length
CLHS
Примеры
(list-length '(a b c d)) → 4
(setq cycle '(a b))
(nconc cycle cycle)
(list-length cycle) → NIL
Функция MAKE-LIST
Примеры
(make-list 3) → (NIL NIL NIL)
Аксессоры FIRST, SECOND, THIRD
FOURTH, FIFTH, SIXTH, SEVENTH, EIGHTH, NINTH, TENTH БК-0011МRT-11
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
(setf (nth n list) new-object) → new-object
CLHS
Примеры
(nth 1 '(A B C))
→ B
(nth 5 '(A B C))
→ NIL
Эквивалент
(nth n list)
≡ (car (nthcdr n list))
Функция NTHCDR
Примеры
(nthcdr 2 '(a b c))
→ (C)
(nthcdr 0 'A)
→ A
Функция REVERSE
Функция NREVERSE
Функция APPEND
Функция LAST
Примеры
(last '(1 2 3)) → (3)
(last '(a b c) 4) → (A B C)
Функция BUTLAST
Эквивалент
(butlast list n)
≡ (ldiff list (last list n))
Примеры
(butlast '(1 2 3 4 5) 2) → '(1 2 3)
Функция NCONC
Функция ENDP
Функция NULL
Функция NOT
Функция SORT
Примеры
(sort #(2 3 -5 3 4.5 0 1) #'>) → #(4.5 3 3 2 1 0 -5)
Функция LDIFF
Функция SUBST
Примеры
(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
Функция MEMBER
member item list → tail
CLHS
Множественные значения
Оператор MULTIPLE-VALUE-LIST
multiple-value-list form → list
CLHS
БК-0011МRT-11
Примеры
(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
Примеры
(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
Примеры
(values) →
(values 1 2 3) → 1, 2, 3 ;; в REPL напечатает: 1 ;
2 ;
3
Функция VALUES-LIST
values-list list → element*
CLHS
БК-0011МRT-11
Примеры
(values-list nil) →
(values-list '(1 2 3)) → 1, 2, 3
Эквивалент
(values-list list)
≡ (apply #'values list)
Множества
Функция INTERSECTION
Примеры
(intersection '(a b c f) '(f a d)) → F A)
Функция SET-DIFFERENCE
Примеры
(set-difference '(a b c f) '(f a d))
→ (C B)
Функция SUBSETP
Примеры
(subsetp '(a b c) '(f a d))
→ NIL
(subsetp '() '(f a d))
→ T
Функция UNION
Примеры
(union '(a b c) '(f a d))
→ (C B F A D)
Последовательности
Аксессор ELT
(setf (elt sequence index) new-object) → new-value
CLHS
Примеры
(elt #(A B C) 1) → B
(elt "ABC" 1) → #\B
Функция FILL
fill sequence item → sequence
CLHS
Примеры
(fill "Hello" #\Z) → "ZZZZZ"
(fill #(A B C) 'Z) → #(Z Z Z)
Функция MAKE-SEQUENCE
make-sequence result-type size → sequence
CLHS
Примеры
(make-sequence 'string 3) → " "
(make-sequence 'list 0) → NIL
Функция REMOVE
remove item sequence → result-sequence
CLHS
Примеры
(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
Примеры
(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-dimensions "Hello") → (5)
Функция ARRAY-IN-BOUNDS-P
array-in-bounds-p array &rest subscripts → generalized-boolean
CLHS
БК-0011МRT-11
Примеры
(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-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
Примеры
(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
Функция MAKE-ARRAY
Примеры
(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 #(a b c)) → T
(vectorp "abc") → T
(vectorp '(a b c)) → NIL
Функция SIMPLE-VECTOR-P
Примеры
(simple-vector-p #(a b c))
→ T
Аксессор AREF
(setf (aref &rest subscripts) new-element) → new-element
CLHS
БК-0011МRT-11
Эквивалент
(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
(setf (row-major-aref index) new-element) → new-element
CLHS
БК-0011МRT-11
Аксессор SVREF
(setf (svref simple-vector index) new-element) → new-element
CLHS
Примеры
(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 1 2 'z nil) → #(1 2 Z NIL)
Строки и Characters
Функция ALPHA-CHAR-P
Примеры
(alpha-char-p #\щ) → T
(alpha-char-p #\6) → NIL
Функция ALPHANUMERICP
Примеры
(alphanumericp #\Г) → T
(alphanumericp #\6) → T
Аксессор CHAR
char string index → character
(setf (char string index) new-character) → new-character
CLHS
Примеры
(char "Abc" 1)
→ #\b
Функция CHARACTER
character character-designator → character
CLHS
Примеры
(character 'a)
→ #\A
Функция CHARACTERP
Примеры
(characterp #\A)
→ T
(characterp "A")
→ NIL
Функции сравнения CHAR=, CHAR/=, CHAR-EQUAL
Примеры
(char= #\d #\d #\d) → T
(char/= #\d #\a #\d) → NIL
(char-equal #\A #\a #\A) → T
Функция CHAR-CODE
char-code char → code
CLHS
Примеры
(char-code #\D)
→ 68
(char-code #\ю)
→ 192
Функция CHAR-INT
char-int char → code
CLHS
Функция CODE-CHAR
code-char code → char-or-nil
CLHS
Примеры
(code-char 65)
→ #\A
(code-char 10)
→ #\NEWLINE
Функция CHAR-NAME
char-name character → name
CLHS
Примеры
(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
Примеры
(name-char "newLINE")
→ #\NEWLINE
(name-char "A")
→ NIL
Функция DIGIT-CHAR
Примеры
(digit-char 15 16) → #\F
(digit-char 7) → #\7
(digit-char 11) → nil
Функция DIGIT-CHAR-P
Примеры
(digit-char-p #\a 11) → 10
Функция CHAR-DOWNCASE
Примеры
(char-downcase #\Space) → #\SPACE
Функция CHAR-UPCASE
Примеры
(char-upcase #\щ) → #\Щ
Функция GRAPHIC-CHAR-P
Примеры
(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
Примеры
(make-string 5) → " "
Функция STRING
string x → string
CLHS
Примеры
(string 'elm) → "ELM"
(string #\c) → "c"
функция STRINGP
Примеры
(stringp "a")
→ T
(stringp #\a)
→ NIL
Функция STRING=
Примеры
(string= "Abc" "ABC")
→ NIL
Функция STRING/=
Примеры
(string/= "Abc" "ABC")
→ T
Функция STRING-EQUAL
Примеры
(string-equal "Abc" "ABC")
→ T
Функция STRING-UPCASE
string-upcase string → cased-string
CLHS
Примеры
(string-upcase "Здравствуй МИР!")
→ "ЗДРАВСТВУЙ МИР!"
Функция STRING-DOWNCASE
string-downcase string → cased-string
CLHS
Примеры
(string-downcase "Hello World!")
→ "hello world!"
Функция NSTRING-UPCASE
nstring-upcase string → string
CLHS
Функция NSTRING-DOWNCASE
nstring-downcase string → string
CLHS
Примеры
(setq str (copy-seq "0123ABCD890a"))
→ "0123ABCD890a"
(nstring-downcase str)
→ "0123abcd890a"
str
→ "0123abcd890a"
Символы
Функция BOUNDP
boundp symbol → generalized-boolean
CLHS
Примеры
(boundp 'pi) → T
(boundp 'abc) → NIL
(setq abc 1) → 1
(boundp 'abc) → T
(let ((lex 1)) (boundp 'lex)) → NIL
Функция MAKUNBOUND
makunbound symbol → symbol
CLHS
Примеры
(setq a 1) → 1
(boundp 'a) → T
(makunbound 'a) → A
(boundp 'a) → NIL
Оператор DEFPARAMETER
defparameter name initial-value → name
CLHS
Примеры
(defparameter p (+ 2 3)) → P
p → 5
(defparameter p 10) → P
p → 10
Оператор DEFVAR
defvar name &optional initial-value → name
CLHS
Примеры
(defvar a (+ 2 3)) → A
a → 5
(defvar a 10) → A
a → 5
Функция FBOUNDP
fboundp name → generalized-boolean
CLHS
Примеры
(fboundp 'car) → #<SYSTEM-FUNCTION CAR>
Функция FMAKUNBOUND
fmakunbound name → symbol
CLHS
Примеры
(fboundp 'asin) → #<SYSTEM-FUNCTION ASIN>
(fmakunbound 'asin) → ASIN
(fboundp 'asin) → NIL
Функция FIND-SYMBOL
find-symbol string &optional package-designator → symbol
CLHS
Примеры
(find-symbol "list") → NIL
(find-symbol "LIST") → LIST
Функция GENSYM
gensym &optional x → new-symbol
CLHS
Примеры
(progn
(setq *gensym-counter* 10)
(gensym "PRE")) → #:PRE10
*gensym-counter* → 11
(gensym 50) → #:G50
(gensym) → #:G11
CLHS
Переменная *GENSYM-COUNTER*
Примеры
(progn
(setq *gensym-counter* 10)
(gensym)) → #:G10
Функция KEYWORDP
keywordp object → bool
CLHSБК-0011МRT-11
Примеры
(keywordp :abc) → T
(keywordp 1) → NIL
Функция INTERN
intern string &optional package-designator → symbol
CLHS
Примеры
(eq 'list (intern "LIST")) → T
(intern "list") → list
(eq (intern "abc") (intern "ABC")) → NIL
Функция UNINTERN
Примеры
(unintern 'machine-type) → T
(find-symbol "MACHINE-TYPE") → NIL
Функция MAKE-SYMBOL
make-symbol name → symbol
CLHS
Примеры
(make-symbol "AbC") → #:AbC
Функция SYMBOL-NAME
symbol-name symbol → name
CLHS
Функция SYMBOLP
Примеры
(symbolp 'a)
→ T
(symbolp "a")
→ NIL
Аксессор SYMBOL-FUNCTION
symbol-function symbol → contents
(setf (symbol-function symbol) new-value) → new-value
CLHS
Примеры
(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
Примеры
(setf (symbol-value 'a) 1) → 1
(let ((a 2)) a) → 2
(let ((a 2)) (symbol-value 'a)) → 1
Оператор PUSH
Эквивалент
(push item place)
≈ (setf place (cons item place))
Примеры
(setq lst '(1)) → (1)
(push 'a lst) → (A 1)
lst → (A 1)
Оператор POP
Эквивалент
(pop item place)
≈ (prog1 (car place) (setf place (cdr place)))
Примеры
(pop (setq stack '(a b c)) → A
stack → (B C)
Оператор ROTATEF
Примеры
(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
Эквивалент
(set symbol value)
≡ (setf (symbol-value symbol) value)
Примеры
(set 'a 1)
→ 1
Оператор SETF
Примеры
(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 a 1 b 2 c 3)
→ 3
b
→ 2
Оператор PSETQ
psetq {pair}* → nil
CLHS
Примеры
(psetq a 1 b 2) → nil
(psetq a (1+ b) b (1+ a)) → nil
(list a b) → (3 2)
Аксессор GET
(setf (get symbol indicator) new-value) → new-value
CLHS
Примеры
(setf (get 'a 'prop) 1) → 1
(get 'a 'prop) → 1
Функция GETF
Примеры
(getf '(a 1 b 2 c 3) 'd 5)
→ 5
Функция REMPROP
Примеры
(setf (get 'a 'prop) 1)
(remprop 'a 'prop) → T
Функция SYMBOL-PLIST
symbol-plist symbol → plist
CLHS
Числа
Функция +
+ &rest numbers → sum
CLHS
Примеры
(+) → 0
(+ 1) → 1
(+ 1 2 3 4) → 10
Функция -
- number → negation
- minuend &rest subtrahends+ → difference
CLHS
Примеры
(- 55.55) → -55.55
(- 0) → 0
(- 10 1 2 3 4) → 0
Функция *
* &rest numbers → product
CLHS
Примеры
(*) → 1
(* 3) → 3
(* 1 0 2) → 0
(* 1 -2 3 4) → -24
Функция /
/ number → reciprocal
/ numerator &rest denominators+ → quotient
CLHS
Примеры
(/ 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
Примеры
(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
Примеры
(progn (setq n -2)
(list (decf n -5) (decf n)) → (3 2)
Функции сравнения чисел =, /=, <, >, <=, >=
Примеры
(= 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
Функция ASH
Примеры
(ash 3 4) → 48
(ash 5 -1) → 2
Функция EXP
Примеры
(exp 0) → 1
(exp (log 5)) → 4.9999999999999806
Функция EXPT
Эквивалент
(expt x y)
≡ (exp (* (log x) y))
Примеры
(expt 4 0.5) → 1.9999999999999984
Функция LOG
Эквивалент
(log base number)
≡ (/ (log number) (log base))
Примеры
(log 1) → 0
(log 100 10) → 2
Функция FLOAT
float number → float
CLHS
Примеры
(type-of (float (length #(1))))
→ FLOAT
Функция FLOAT-RADIX
float-radix float → 2
CLHSБК-0011МRT-11
Функция FLOATP
floatp object → generalized-boolean
CLHS
Примеры
(floatp 1.5) → T
(floatp "1") → NIL
(floatp (length #(1 2 3))) → NIL
Функция INTEGERP
integerp object → generalized-boolean
CLHS
Примеры
(integerp (+ 0.5 0.5))
→ T ; несовместимость с CL
Функция NUMBERP
Примеры
(numberp 3.14)
→ T
Функция REALP
realp object → generalized-boolean
CLHS
Примеры
(realp (length #(1 2 3)))
→ T
Константа PI
pi → 3.1415926535897932
CLHS
Функция SCALE-FLOAT
scale-float float integer → float × 2integer
CLHSБК-0011МRT-11
Примеры
(scale-float 1.0 1) → 2
(scale-float 10.01 -2) → 2.5025
Тригонометрические функции SIN, COS, TAN, ASIN, ACOS, ATAN
Гиперболические функции SINH, COSH, TANH
Примеры
(sinh 0.5) → .52109530549374555
Функция SQRT
sqrt number → √number
CLHS
Примеры
(sqrt 12) → 3.4641016151377546
Функция ISQRT
isqrt natural → ⌊√number⌋
CLHS
Эквивалент
(isqrt x)
≡ (floor (sqrt x))
Примеры
(isqrt 12) → 3
Функция FLOOR
floor number &optional (divisor 1) → ⌊number / divisor⌋, reminder
CLHS
Примеры
(floor 5.9) → 5
(floor -6.5 2) → -4; 1.5
Функция TRUNCATE
Примеры
(truncate 5.9) → 5
(truncate -6.5 2) → -3; -0.5
Функция REM
Примеры
(rem 13 4)
→ 1
(rem -13 4)
→ -1
Функция EVENP
Функция ODDP
Функция MIN
Примеры
(min 1 -3.3 2)
→ -3.3
Функция MAX
Примеры
(max 1 -9.1 2)
→ 2
Функция MINUSP
Функция PLUSP
Функция SIGNUM
Эквивалент
(signum x)
≡ (if (zerop x) x (/ x (abs x)))
Примеры
(signum -3.4) → -1
(signum 0) → 0
Функция ZEROP
Логические функции LOGAND, LOGANDC1, LOGANDC2, LOGEQV, LOGIOR, LOGNAND, LOGNOR, LOGNOT, LOGORC1, LOGORC2, LOGXOR
Логическое НЕ
Логическое И, без аргументов возвращает -1 (в бинарнмо представлении все единицы).
Логическое ИЛИ, без аргументов возвращает 0.
Логическое Исключающее ИЛИ (XOR), без аргументов возвращает 0.
Логическое XNOR, без аргументов возвращает -1.
Логическое И-НЕ (NAND).
Логическое ИЛИ-НЕ (NOR).
Очистка битов по маске
Сравнения
Функция EQ
Функция EQL
(eq x y)
→ true
Примеры
(eql 'a 'b)
→ false
(eql 3.0 3.0)
→ true
Функция EQUAL
(eql x y)
→ true
(and (equal (car x) (car y)) (equal (cdr x) (cdr y)))
(рекурсивно сравниваются car и cdr части).
Примеры
(equal (cons 'a 'b) (cons 'a 'b))
→ T
Функция EQUALP
(equal x y)
→ true
(char-equal x y)
(равны без учета регистра).
Примеры
(equalp #\A #\a)
→ T
Булева логика
Оператор AND
Примеры
(and 'A (+ 2 4))
→ 6
Оператор OR
Примеры
(or nil (+ 2 2) nil 5)
→ 4
Типы
Функция COERCE
Примеры
(coerce #(1 2 3) 'list) → (1 2 3)
Функция TYPE-OF
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) → #\Y
(inkey) → NIL
Функция LOAD
Примеры
; файл fact.lisp
(defun factorial (a) (if (zerop a) 1 (* a (factorial (1- a)))))
(load "fact.lisp") → FACT
(fact 9) → 362880
Функция MAKE-STRING-INPUT-STREAM
Примеры
(read (make-string-input-stream "123")) → 123
Функция READ
Функция PEEK-CHAR
Примеры
(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 (make-string-input-stream "123"))
→ #\1
Функция UNREAD-CHAR
unread-char char &optional input-stream → nil
CLHS
Примеры
(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
Примеры
(read-delimited-list #\] (make-string-input-stream "1 2 3 ]")) → (1 2 3)
Функция INPUT-STREAM-P
input-stream-p object → generalized-boolean
CLHS
Примеры
(input-stream-p (make-string-input-stream "123")) → T
Функция STREAMP
streamp object → generalized-boolean
CLHS
Примеры
(streamp *standard-input*) → T
Функция Y-OR-N-P
Примеры
(y-or-n-p "Ты перестала пить коньяк по утрам?") → Ты перестала пить коньяк по утрам?
→ Y/N
Вывод
CLHS
Переменная *PRINT-BASE*
Примеры
*print-base* → 10
(let ((*print-base* 8))
(print 32766)) → 77776 ; вывод PRINT
→ 32766 ; результат LET
CLHS
Переменная *PRINT-ESCAPE*
*print-escape*
присваивают nil. Для машино-читаемого вывода - t.
Примеры
(let ((*print-escape* nil)) (write "AB")) → AB ; вывод WRITE
→ "AB" ; результат LET
CLHS
Переменная *PRINT-RADIX*
Примеры
(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 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 stream) ≡ (let ((*standard-output* stream)
(*print-escape* t))
(write object))
Примеры
(prin1 #\A) → #\A ; вывод PRIN1
→ #\A ; возвращаемое значение
Функция PRINC
Эквивалент
(princ object stream) ≡ (let ((*standard-output* stream)
(*print-escape* nil))
(write object))
Примеры
(princ #\A) → A ; вывод PRINC
→ #\A ; возвращаемое значение
Функция PRINT
Эквивалент
(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
Примеры
(progn (princ "A")
(fresh-line)
(fresh-line)
(princ "B")
(fresh-line)) → A
→ B
→ #<STREAM> ; возвращаемое значение истина
Функция TERPRI
Функция WRITE
Примеры
(let ((*print-escape* nil))
(write "ABC")) → ABC
→ "ABC" ; возвращаемое значение
Функция WRITE-CHAR
Примеры
(write-char #\ю) → ю
→ #\ю ; возвращаемое значение
Функция WRITE-LINE
Примеры
(progn (write-line "AB")
(write-line "CD")) → AB
→ CD
→ "CD" ; возвращаемое значение
Функция WRITE-STRING
Примеры
(progn (write-string "AA")
(write-string "BB")) → AABB
→ "BB" ; возвращаемое значение
Функция GET-OUTPUT-STREAM-STRING
Функция MAKE-STRING-OUTPUT-STREAM
Примеры
(let ((stm (make-string-output-stream)))
(write-string "number " stm)
(prin1 123 stm)
(get-output-stream-string stm)) → "number 123"
Файлы
Функция DELETE-FILE
delete-file filespec → T
CLHS
RT-11
Примеры
(delete-file "test1.tmp") → T
(delete-file (open "test2.tmp")) → T
Функция CLOSE
close stream → result
CLHS
Примеры
(close (make-string-input-stream "abc")) → T
Функция FILE-LENGTH
file-length file-stream → length
CLHS
RT-11
Примеры
(file-length (open "a.txt")) → 512
Функция FILE-POSITION
file-position stream → position
CLHS
RT-11
Примеры
(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
Примеры
(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
Примеры
(open-stream-p (make-string-input-stream "abc")) → T
Функция PROBE-FILE
probe-file filespec → filename
CLHS
RT-11
Примеры
(probe-file "test1.tmp") → NIL
Функция RENAME-FILE
rename-file filespec new-name → new-name
CLHS
RT-11
Примеры
(rename-file "a.txt" "b.dat") → "b.dat"
Время
Функция DECODE-UNIVERSAL-TIME
decode-universal-time universal-time → second, minute, hour, day, month, year, day-of-week, NIL, 0
CLHS
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
Примеры
(encode-universal-time 1 2 3 14 8 2022) → 3869434921
Функция GET-INTERNAL-REAL-TIME
get-internal-real-time → internal-time
CLHS
Примеры
(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_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
Оператор TIME
time form → result
CLHS
Примеры
(time (* 1 2 3 4))
51 ms
→ 24
Генератор случайных чисел
⚠ Так как в БК-0010.01 отсутствует надёжный источник случайности, генерируемые числа псевдо-случайны. Их нельзя использовать для криптографических целей.
Переменная *RANDOM-STATE*
CLHS
Функция MAKE-RANDOM-STATE
make-random-state &optional (state nil) → random-state
CLHS
Примеры
(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
Примеры
(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
Функция ROOM
room → unknown
CLHS
Функция EXTROOM
нестандартная
extroom → unknown
Переменная *ARGS*
Примеры
(defun main () (print *args*)) → MAIN
(save "hello.sav" 'main) → T
(quit)
.RUN HELLO new year 2023 → ("new" "year" "2023")
Функция SAVE
Примеры
(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
Примеры
(+ 0 1) → 1
(- 4 2) → 2
(/ 9 3) → 3
(list + ++ +++) → ((/ 9 3) (- 4 2) (+ 0 1))
Переменная -
CLHS
БК-0011МRT-11
Примеры
(list -) → ((LIST -))
Переменные *, **, ***
CLHS
БК-0011МRT-11
Примеры
(+ 4 5) → 9
(+ 1 2) → 3
* → 3
*** → 9
Переменные /, //, ///
CLHS
БК-0011МRT-11
Примеры
(floor 22 7) → 3 ;
1
(+ (* (car /) 7) (cadr /)) → 22
Функция PEEK
нестандартная
peek address → int16
Функция POKE
нестандартная
poke address int16 → int16
Работа с функциями
Оператор DEFUN
Примеры
(defun factorial (x)
(if (zerop x)
1
(* x (factorial (1- x))))) → FACTORIAL
(factorial 13) → 6227020800
Оператор LAMBDA
Список аргументов 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
)
.
Примеры
(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
Функция APPLY
Функция FDEFINITION
Примеры
(fdefinition 'tan) → #
Функция FUNCALL
Оператор FUNCTION
#'name
.
Примеры
(function 'exp) → #<SYSTEM-FUNCTION EXP>
#'sin → #<SYSTEM-FUNCTION SIN>
Функция FUNCTIONP
Примеры
(functionp #'sin) → T
(functionp 'sin) → NIL
(functionp (lambda (a) a)) → T
Функция IDENTITY
Функция EVAL
Оператор QUOTE
'object
.
Примеры
(quote (+ 1 2)) → (+ 1 2)
'a → A
(list '(+ 1 2)) → ((+ 1 2))
Функция MAPC
Примеры
(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 #'cons '(a b c) '(1 2 3 4)) → ((A . 1) (B . 2) (C . 3))
Функция REDUCE
Примеры
(reduce #'* '(1 2 3 4 5)) → 120
(reduce #'list '(1 2 3 4)) → (((1 2) 3) 4)
Функция SPECIAL-OPERATOR-P
Примеры
(special-operator-p 'if)
→ T
(special-operator-p 'car)
→ NIL
Управление выполнением
Оператор BLOCK
block name form* → result
CLHS
Примеры
(block early (return-from early 1) 2) → 1
Оператор RETURN
return &optional (result nil) → result
CLHS
Эквивалент
(return form) ≡ (return-from nil form)
Примеры
(block nil (block alpha (return 1) 2)) → 1
Оператор RETURN-FROM
return-from name &optional (result nil) → result
CLHS
Примеры
(block alpha (return-from alpha) 1) → NIL
Функция ERROR
error datum →
CLHS
Примеры
(if nil "OK" (error "Условие нарушено")) → ОШИБКА "Условие нарушено"
Оператор GO
go tag →
CLHS
Оператор TAGBODY
tagbody {tag | statement}* → nil
CLHS
Оператор COND
clause ::= (test-form form*)
CLHS
Примеры
(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) ≡ (cond (test-form then-form) (t else-form))
Примеры
(if t 1) → 1
(if nil 1 2) → C
Оператор WHEN
Эквивалент
(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}+) ≡ (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
CLHS
Примеры
(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
Примеры
(let (r)
(dolist (a '(1 2 3) r)
(push a r))) → (3 2 1)
Оператор DOTIMES
Примеры
(dotimes (n 3 n)
(print n)) → 0
→ 1
→ 2
→ 3 ; результат
Оператор LET
Примеры
(setq a '1)
(let ((a 2)
(b a))
(list a b)) → (2 1)
Оператор LET*
Примеры
(setq a '1)
(let ((a 2)
(b a))
(list a b)) → (2 2)
Оператор PROG1
Примеры
(prog1 'A 'B (prin1 1) 'D) → 1 ; побочный эффект
→ A ; результат
Оператор PROG2
Примеры
(prog2 'A 'B (prin1 1) 'D) → 1 ; побочный эффект
→ B ; результат
Оператор PROGN
Примеры
(progn 1 2 3) → 3
Оператор PROGV
Примеры
(let ((*x* 3))
(progv '(*x*) '(4)
(list *x* (symbol-value '*x*)))) → (3 4)
Отладка
Оператор TRACE
trace function-name* → trace-result
CLHS
БК-0011МRT-11
Примеры
(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
Коды ошибок
Коды ошибок совпадают по смыслу с кодами БЕЙСИК, когда возможно.
Канал занятRT-11
Литература
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 Одна из самых рекомендуемых книг для начинающих