Lisp2D
Запуск интерпретатора
> ./lisp2d
Запуск без параметров входит в интерактивный режим с помощью функции read-eval-print.
> ./lisp2d filename [{ argi }]
Пошагово выполняет все формы, хранящиеся в файле filename. Перед выполнением файла переменная arg связывается со списком строк ( "arg1" … "argn" ).
Во всех случаях полученный результат вычисления возвращается как код возврата программы, если результатом было значение типа char или integer, иначе код возврата - 0.
Интерпретатор использует системную многопоточность, нити стандарта POSIX.
Количество работающих потоков будет равно количеству процессоров. Количество записей истории вычислений равно 12.
История вычислений при программировании даёт большое преимущество. Видны все узлы хода программы и виден участок, в котором произошло непредвиденное действие. Скорость отладки программы увеличивается на порядок.
(nil setdebug),(nil setdebug false),(nil setdebug 0) - отменяет запись в историю вычислений. Скорость программы увеличивается.
(nil setdebug number) - изменяет размер истории вычислений.
(nil getdebug) - возвращает размер истории вычислений.
(cerr error) - увидеть историю вычислений.
Синтаксис
(obj … obj) - список
#(obj … obj) – вектор (массив)
-
"ab…z" - строка
-
Строка имеющая специальные знаки создаётся с помощью знака \
"the \"abc\" is string" - это одна строка
"\\" - строка из одного знака \
;abc…z – комментарий до конца строки
'obj - запрещение вычислений, цитирование.
`obj - обратная квота (частичное запрещение вычислений).
,obj=(nil BIM(nil,unquote) obj) - вычисление внутри `.
,@obj=(nil BIM(nil,unquote-splicing) obj) - вычисление со вставкой внутри `.
(obj . obj) - точечная пара
-
#\c - буква (знак) c
-
#\space - пробел
#\tab - табуляция
#\enter
#\escape
Ключевые слова и переменные окружения
-
&rest - связывает переменную со списком оставшихся аргументов
-
(nil defmethod m (a &rest b) (cout writeln a b))
(nil m 1 2 3 4) →
1
(2 3 4)
&env - связывает переменную с контекстом момента вызова функции.
-
&whole - связывает переменную с оригинальным вызовом, где не вычислены ни объект ни аргументы.
-
>(nil defmethod t (&whole w) (cout writeln "w=" w))
(lambda (&whole w) (cout writeln "w=" w))
>((10 + 10) t)
w=((10 + 10) t)
nil – ничего или пустой список
true- логическая правда
false - логическая ложь
Глобальные переменные:
package - переменная, связывается с загружаемым файлом
arg - переменная, связывается со списком аргументов, передаваемых при загрузке файла.
pi=3.141592653589… π
e=2.718281828459…
cin - стандартный поток ввода
cout - стандартный поток вывода
cerr - стандартный поток для сообщений об ошибках.
xk-enter, xk-home, xk-end, xk-left, xk-right, xk-up, xk-down, xk-page-up, xk-page-down, xk-insert, xk-delete, xk-caps-lock, xk-shift-l, xk-shift-r, xk-control-l, xk-control-r, xk-alt-l, xk-alt-r, xk-f1, xk-f2, xk-f3, xk-f4, xk-f5, xk-f6, xk-f7, xk-f8, xk-f9, xk-f10, xk-f11, xk-f12, xk-backspace, xk-undo, xk-num-lock, xk-kp-multiply, xk-space, xk-numbersign, xk-question - коды нажатых клавиш для функции (window read-keyb)
В объектах:
this - значение себя (объекта)
Типы
-
(nil type-of obj) - возвращает символ, обозначающий тип результата вычисления obj, для объектов возвращает имя класса
-
nil - ничего (пустой список)
false - ложь
true - логическая правда
cons - списочная ячейка
vector - вектор (массив)
string - строка букв
number - число (только один тип чисел)
symbol - символ
char - буква
stream - поток ввода/вывода
window - окно
time - дата и время.
dir - обработчик каталогов.
bif - встроенная в ядро функция.
lock - замок.
signal - сигнал.
environment - окружение.
quote - '.
При определении типов лучше пользоваться логическими функциями:
-
(nil atom obj) - obj не является списочной связкой
-
(nil atom nil) → true
(nil atom false) → true
(nil atom cons) → false
(nil atom obj) → obj
-
(nil = {obj}) - все obj равны nil
-
(nil = false) → false
(nil = nil) → true
(nil = true) → false
-
(nil <> {obj}) - ни один obj не равен nil
-
(nil <> false) → true
(nil <> nil) → false
(nil <> true) → true
-
(false = {obj}) - равенство false
-
(false = false) → true
(false = nil) → false
(false = true) → false
-
(false <> {obj}) - ни один obj не равен false
-
(false <> false) → false
(false <> nil) → true
(false <> true) → true
-
(true = {obj}) - равенство true
-
(true = false) → false
(true = nil) → false
(true = true) → true
(true = 12) → false
-
(true <> {obj}) - ни один obj не равен true
-
(true <> false) → true
(true <> nil) → true
(true <> true) → false
-
(nil stringp obj) - obj строка
-
(nil stringp "ab") → "ab"
(nil stringp 1) → false
-
(nil charp x) - буква
-
(nil charp #\t) → #\t
(nil charp true) → false
-
(nil listp obj) - соответствия списочной ячейке или nil
-
(nil listp nil) → true
(nil listp 1) → false
(nil listp '(1 . 2)) → (1 . 2)
-
(nil consp obj) - соответствия списочной ячейки
-
(nil consp 1) → false
(nil consp '(1)) → (1)
-
(nil vectorp obj) - соответствия вектору
-
(nil vectorp #(1 2)) → #(1 2)
(nil vectorp 1) → false
(nil symbolp obj) - соответствия символу
(nil numberp obj) – число
-
(nil streamp obj) - поток
-
(nil streamp notstream)→false
(nil streamp stream)→stream
(nil objectp obj) – объект класса
-
(nil windowp x) - соответствия окну
-
(nil windowp win) → win
(nil windowp 1) → false
(nil timep obj)
(nil dirp obj)
(nil bifp obj)
(nil lockp obj)
(nil signalp obj)
(nil envp obj)
(nil quotep obj)
Символы
Символы это вспомогательный объект для программирования, в "Чистом Лиспе" символов нет. Они могут иметь значения: обычные и функциональные, у них имеется вспомогательные свойства.
(symb <> s1 … sn) – ни один символ si не равен symb
(symb = symb…symb), (symb < symb…symb), (symb <= symb…symb), (symb > symb…symb), (symb >= symb…symb) - сравнения (по алфавиту).
(symb min symb … symb), (symb max symb … symb) - минимальный/максимальный (по алфавиту).
-
(symb + {symb|string|char}) - новый символ
-
(('abc + '- 'def) set 1)=('abc-def set 1)
-
(symb - symb … symb) – новый символ
-
(('abcdef - 'cd) set 1)=('abef set 1)
(string|char symbol) - возвращает символ с именем string|char.
-
(symbol put prop val) – устанавливает свойство prop символа symbol со значением val , возвращает val
-
Свойство символа находится только в текущем пространстве имён.
('work1 namespace
(symbol put prop propv))
('work2 namespace
(symbol get prop)) → NIL
-
(symb get prop) - свойство символа symb с именем prop. При отсутствии данного свойства возвращается NIL
-
При вхождении нескольких пространств имён возвращается первое попавшее свойство.
('std namespace
(symb put prop propv)
…
('another namespace
(symb get prop) → propv
…))
(symb remprop prop) - удаляет свойство символа symb с именем prop. Если удаляемого свойства нет - возвращается false иначе true. Удаляется свойство только в текущем пространстве имён.
(symb properties) - возвращает все свойства символа как #((symb . value)…) , пары в векторе отсортированы по symb
(symbol boundp [env]) – есть ли у символа значение. Возвращает true или false.
(nil|symbol gensym) - Функция-генератор разных символов, начинающихся на symbol, если начальный символ не указан начинается на t. Гарантируется, что возвращаемый символ является новым.
Установка значений
-
(symbol set val [env]) - вычисляется значение всех аргументов, val становится значением символа symbol. При наличии env значение устанавливается туда.
-
(('(x y) first) set 1)=(nil setq x 1)
-
(var letset val) - присваивание значений переменной var в текущем окружении(не трогает значение переменной выше). Имя переменной var вычисляется. Результатом будет val
-
Применяется при запоздании определения переменных формы let:
('x set 1)
(nil let ()
…
('x letset -2)
…)
x → 1
-
(nil|environment setq {symb val}) - присваивание значения val символу symb
-
Символ symb не вычисляется
(nil setq x (10 - 1))
x → 9
Формы управления
(nil progn b1 … bn) - пошаговое вычисление b1 … bn , возвращает результат вычисления bn после вычисления всех форм b1…bn.
-
(nil parallel task … task) - параллельное вычисление задач task. Возвращается nil
(nil fork {body}) - создаёт новую задачу (nil progn {body}), не ожидает результата и возвращает nil.
-
(nil if test then else) - вычисляет test, если это значение nil или false вычисляет else , иначе - вычисление then.
-
(nil if) →nil
(nil if test)=(nil progn test nil)
-
(nil when test {work})=(nil if test (nil progn {work})) - если будет положительным результат вычисления test, вычисляет пошагово задачи work.
(nil let ((var1 {val1})|var1…(varn {valn})|varn) {body}) - создаёт параллельно локальные связи переменных var со значениями val и пошагово вычисляет формы body. Переменные без значения val инициализируются значением nil.
-
(nil cond (test1 [{form1}]) … (testn [{formn}])) - пошагово вычисляются testi пока не найдется не false и не nil значение. Возвращает результат последнего вычисления соответствующей формы formi. Если formi не указана, возвращается результат вычисления testi
-
(nil cond (false 1)) →nil
(nil cond (false 1) (nil (cout write …))) → nil
(nil cond (false 1) (ok oking)) → вычисление oking
(nil cond (false 1) (ok)) → ok
(nil cond (false 1) (notok oking) (true default)) → вычисление default
'obj - блокируется вычисление obj.
(nil|environment eval obj) - двойное вычисление. Сначала obj вычисляется как аргумент функции eval, затем возвращается результат вычисления интерпретатором полученного значения в окружении environment.
(nil|environment apply obj fn arglist) - применение функции fn к аргументам arglist. Значением переменной fn может быть имя или лямбда список. Аргументы и объект вычисляются только один раз.
(nil|environment funcall obj fn [{arg}]) - применение функции fn к аргументам arg. Значением переменной fn может быть имя или лямбда список. Аргументы и объект вычисляются только один раз.
-
`obj - частичное запрещение вычислений аргумента obj. Когда внутри формы obj встречается запись ,x - то подформа x вычисляется и подставляется в форму obj. Также есть запись ,@x - она означает что значение x как список подставляется по-элементно в форму obj.
-
('l set '(1 2 . 3))
`(0 ,l ,@l)→(0 (1 2 . 3) 1 2)
-
,obj=(nil BIM(nil,unquote) obj) - вставка внутри формы `.
-
Нельзя использовать , в хвостовой части списка.
`(a . ,(1 + 1))=`(a nil BIM(nil,unquote) (1 + 1))
Такие списки строятся вручную: (nil cons 'a (1 + 1)).
-
,@obj=(nil BIM(nil,unquote-splicing) obj) - вставка с развёрткой внутри формы `.
-
`(a ,@'(1 + 1) b c)→(a 1 + 1 b c)
(string load [arg1 … argn]) - считывает файл с именем string, вычисляет и возвращает соответствующий результат. Перед вычислением переменная arg связывается со списком аргументов (arg1 … argn). После вычисления восстанавливается предыдущее значение arg.
(string save obj) – записывает объект obj в формате печати в файл с именем string.
(nil do-while {body}) - циклическое вычисление форм body, если последним результатом будет nil или false,то вычисления прекращаются и результатом будет это значение.
(nil while test {body}) – пошаговый условный цикл. Проверяется test, если test=false или nil то результатом будет это значение. Потом пошагово выполняются формы body, затем шаг на проверку test.
-
(nil try task-body {exception-name exception-body}) - запускается задача task-body. Если в процессе вычисления было исключение запускается задача exception-body. Имена исключений exception-name не вычисляются. Проверка имени производится с помощью идентичности eq. Если не поставлено имя текущего исключения, никаких дополнительных задач не будет и исключение остаётся. Последним именем можно поставить nil, тогда любое исключение будет обрабатыватся.
-
(nil try (nil setq result (nil eval task)) nil (nil setq error true)) - если при интерпретировании задачи task произошла ошибка, ставится флажок error.
-
(nil throw exception) - вычисляются аргумент, устанавливается исключение.
-
(nil throw `(,x " is not accepted"))
-
(nil exception) - возвращается текущее исключение.
-
(nil try (nil eval task) nil (cerr writeln "exception: " (nil exception)))
-
(nil exception-history) - возвращается история вычислений в момент, когда произошло исключение. Вне блока try возвращается nil. История это список (… (integer-number-глубина-вычислений-в-стеке bool-вход/выход команда) …). Для просмотра можно вызвать функцию (stream history-show (nil exception-history)).
-
(nil try (nil eval task) nil (cerr writeln "exception-history: " (nil exception-history)))
-
(stream history-show history) - выводит в поток историю вычислений, заданая как список (… (integer-number-глубина-вычислений-в-стеке bool-вход/выход команда) …). Историю вычислений можно получить с помощью функции (nil exception-history).
-
(nil try (nil eval task) nil (cerr writeln "exception-history: ") (cerr history-show (nil exception-history)))
Логика
- (nil not obj) - отрицание
-
(nil not nil) → true
(nil not false) → true
(nil not true) → false
(nil not 1) → nil
- (nil or a b … z) - вычисляет параллельно аргументы и возвращает первое вычисленное не false и не nil значение, если такого не попалось – false
-
(nil or) → false
(nil or nil) → false
(nil or true) → true
(nil or false) → false
(nil or false nil) → false
(nil or false nil 123) → 123
-
(nil and a b … z) - вычисляет параллельно аргументы и возвращает первое вычисленное false или nil значение, если такого не попалось – последний аргумент
-
(nil and) → true
(nil and nil ) → false
(nil and false) → false
(nil and 123) → 123
(nil and 123 nil) → false
(nil and 123 nil false) → false
-
(nil xor a b … z) - возвращает единственное утвердительное значение, если такого попалось больше чем одно - false
-
(nil xor) → false
(nil xor nil) → false
(nil xor false) → false
(nil xor 123) → 123
(nil xor false false) → false
(nil xor false 123) → 123
(nil xor 123 234) → false
(nil xor nil 123) → 123
(nil xor false 1 false false) → 1
(nil xor false 1 false nil 2) → false
-
(nil eq a b) - физическое равенство двух объектов (равенство указателей)
-
(nil eq) → true
(nil eq a) → (nil = a)
(nil eq nil nil) → true
(nil eq false false) → true
(nil eq 1 1) → false
(nil eq 'sym 'sym) → sym
Числа
-
(a + b c … z) - сложение a+b+c+…+z.
-
(a +) → a
(a + 1) → a+1
-
(a - b c … z) - вычитание a-b-c-…-z.
-
(a -) → -a
(a - 1 2) → a-3
-
(a * b … z) – умножение.
-
(a *) → a
-
(a / b … z) - деление a на все остальные значения.
-
(a /) → 1/a
(a / 2 3) → a/6
-
(a = b … z) – равенство a=b=…=z.
-
(2 = "string") → false
(0/0 = any-number) → nil
(any-number = 0/0) → nil
(2 = 2) → 2
(2 = 3) → false
(n <> x1 … xk) - ни одно число xi не равно n.
(a < b … z) - числа возрастают a<b<…<z.
(a > b … z) - числа убывают a>b>…>z.
(a <= b … z) - меньше или равно(не убывают) a≤b≤…≤z.
(a >= b … z) - больше или равно(не возрастают) a≥b≥…≥z.
При удачном сравнении возвращается первый аргумент a.
(x nanp) – предикат на 0/0.
(x infp) – предикат на ±∞.
(x finitep) – предикат на конечное число, не ±∞ и не 0/0.
-
(number integerp) - целое число.
-
(1.5 integerp) → false
(2 integerp) → 2
(1/0 integerp) → nil
-
(number evenp) - предикат, на чётность.
-
(3 evenp) → false
(-4 evenp) → -4
(3.5 evenp) → nil
-
(number oddp) - предикат, на нечётность.
-
(4 oddp) → false
(-5 oddp) → -5
(3.5 oddp) → nil
(numb min numb … numb), (numb max numb … numb) – минимальное/максимальное число.
-
(a abs) – абсолютное значение.
-
(2 abs) → 2
(-3 abs) → 3
-
(x ceil [d]) - наименьшее целое, не меньшее x (ceiling=потолок).
-
(-2.5 ceil)=-2
(2.5 ceil)=3
(7 ceil 2)=((7 / 2) ceil)=4
(2 ceil)=2
-
(x floor [y]) - округление x в меньшую сторону до целого числа. Если дано y то возвращается целая часть от деления x на y (floor=пол).
-
(-2.5 floor) =-3
(13 floor 4) =3
(-13 floor 4) =-4
-
(x % [y]) - остаток от деления x на y.
-
(13 % 4) =1
(-13 % 4) =3
(13 % -4) =-3
(-13 % -4) =-1
(13.4 % 1) =0.4
(-13.4 % 1) =0.6
(2.3 %)=(2.3 % 1)=0.3
-
(x gcd [{xi}]) - наибольший общий делитель целых чисел, возвращает положительное целое число.
-
(3 gcd)=3
(-10 gcd) =10
(12 gcd -8) =4
(32 gcd 16 3) =1
-
(x lcm [{xi}]) - наименьшее общее кратное целых чисел, возвращает положительное целое число.
-
(3 lcm)=3
(-10 lcm) =10
(12 lcm -8) =24
(32 lcm 16 3) =96
(x sin) - синус.
(x cos) – косинус.
(x tg) – тангенс.
(x ctg) – котангенс.
(x arcsin)=sin-1x
(x arccos)=cos-1x
(x arctg)=tg-1x
(x arctg y)=tg-1(x/y) ,y>0 ,x>0
(x sh)=(ex-e-x)/2
(x ch)=(ex+e-x)/2
(x th)=sh(x)/ch(x)
(x cth)=ch(x)/sh(x)
(x arsh)=sh-1x
(x arch)=ch-1x
(x arth)=th-1x
(x sqrt) - квадратный корень √x
(x cbrt) - кубический корень x1/3
(x exp) – экспонента ex
(b ^ n) – степень bn
(x log [a])=logax - логарифм по основанию a (по умолчанию натуральный логарифм).
(x ln)=ln(x) - натуральный логарифм.
(x lg)=log10x - десятичный логарифм.
-
(n string [digc]) - возвращает строку, которая точно представляет число. Может быть в дробном виде. При необходимости устанавливается максимальное количество цифр digc.
-
(4/6 string) → "2/3"
(4/6 string 2) → "6.7e-1"
(4/6 string 0) → "6.66666666667e-1" ; 12 цифр
(x !)=1*2*…*x – факториал.
-
-
(nil random) - возвращает случайное вещественное число, в интервале [0…1).
-
(nil random) → 0.102355897908
-
(numb random) - возвращает случайное вещественное число, меньшее по абсолютному значению, чем numb.
-
(pi random) → 2.0939049352352
(-3 random) → -1.194246236960
-
(number for symbol {body}) – параллельно локальным переменным symbol (для каждого процесса своя переменная symbol) присваиваются числа 0…number-1, при каждом значении вычисляются пошагово формы body.
-
(3 for i (cout write " i+1=" (i + 1)) (i + 1)) →
i+1=2 i+1=1 i+1=3
→ nil
-
(number for* symbol {body}) – пошагово локальной переменной symbol присваиваются числа 0…number-1, вычисляются пошагово формы body. Возвращается последний результат формы body.
-
(3 for* i (cout writeln "i=" i "..")) →
i=0..
i=1..
i=2..
-
(number setf number)=(number number number) - физически меняет число новым значением. Использование данной операции чревато ошибками программирования.
-
('x set 7) → 7
('y set (nil list x x x)) → (7 7 7)
(x setf (x - 1)) → 6
y → (6 6 6)
Для избежания порчи работающей программы следует пользоваться функцией копирования:
(nil let ((x 0)) … → (nil let ((x (0 copy))) …
('x set 0) → (x setf 0)
(nil setq x 0) → (x setf 0)
-
(number copy)=('number newobject number) - возвращает новое число.
-
('number newobject number)=(number copy)
('number newobject)≈(0 copy)
-
(number += [{x}])≈(number setf (number + [{x}]))
-
(number -= [{x}])≈(number setf (number - [{x}]))
-
(number *= [{number}])≈(number setf (number * [{number}]))
-
(number /= [{number}])≈(number setf (number / [{number}]))
-
(number degrees)=number*180/π
-
(number radians)=number/180*π
-
(n combin x)=C(x,n)=n!/x!/(n-x)!
-
(n combina x)=n!/(n-x)!
-
(nil multinomial x … z)=(x+…+z)!/x!…/z!
-
(number round quality) - возвращает округление при относительной точности quality. [number*(1-quality) … number*(1+quality)]
-
>(pi round 1e-3)
3.14375
>(pi round 1e-4)
3/225/1592
-
(number roundint) - возвращает округление до ближайшего целого числа.
-
(number num) - положительный целый числитель числа. (num=numeratoreng)
-
(number denom) - положительный целый знаменатель числа. (denom=denominatoreng)
Список
-
(list first) - возвращает первую часть списка list.
-
('(1 2 3) first)→1
(nil first)→nil
-
(list rest) - возвращает хвостовую часть списка list.
-
('(1 2 3) rest) → (2 3)
(nil rest)→nil
(list second)=((list rest) first)
(list third)=(((list rest) rest) first)
-
(list size) - возвращает длину списка list(количество списочных ячеек).
-
(nil size) → 0
(nil cons first rest) - создаёт списочную ячейку с соответственными ссылками.
('cons newobject first rest)=(nil cons first rest)
('cons newobject another-cons)=(another-cons copy)
('cons newobject)=(nil cons nil nil)
-
(list elt [{integer}]) - возвращает элемент списка listinteger,…. Элементы списка нумеруются: 0 - first(list) 1 - second(list) … (size-1) – first(last(list)).
-
('((1 2) (3 4)) elt) → ((1 2) (3 4))
('((1 2) (3 4)) elt 0) → (1 2)
('((1 2) (3 4)) elt 0 1) → 2
('((1 2) (3 4)) elt 0 1 2) → nil
(nil list arg1 … argn) - возвращает список аргументов (arg1 … argn), аргументы вычисляются параллельно
-
(nil list* arg1 … argn) - возвращает список аргументов (arg1 … argn-1 . argn), последний аргумент соединяется как хвост, аргументы вычисляются параллельно
-
(nil list* 'a 'b '(c d e)) → (a b c d e)
-
(list last) - возвращает последнюю списочную ячейку
-
('(1 2 3) last) → (3)
('(1 2 . 3) last) → (2 . 3)
('() last) → nil
-
(list + {list}) - возвращает объединение списков list. Все списки не разрушаются.
-
('(1 2 3) + '(4 5 6)) → (1 2 3 4 5 6)
('(1 2 3) + ’atom '(a) nil '(dotted . list)) → (1 2 3 a dotted . list)
-
(list reverse) – создаёт новый список с обращением порядка элементов.
-
('(1 2 3) reverse) → (3 2 1)
-
(list remove elt) – удаляет из списка элементы удовлетворяющие равенству (elt = listi), возвращает новый список без данных элементов
-
('(1 2 3) remove 2) → (1 3)
-
(list substitute old new) – замена элементов old на new (при сравнении используется метод =). Возвращает новый список.
-
('(a x x a) substitute 'x 'b) → (a b b a)
(list copy) - возвращает новый список. Копируются только ячейки верхнего уровня.
(list copy-tree) - возвращает новое дерево. Копируются все ячейки, и first и rest.
-
(cons setfirst newfirst) - заменяет головную часть списка cons объектом newfirst
-
-
(list setrest newrest) - заменяет хвостовую часть списка list объектом newrest. Если list элемент вашей программы, то надо знать, что эти процедуры изменяют саму программу и тяжело представить как она потом выглядит. Чтобы у вас не было ошибок используйте в программе не (nil let ((l '(nil progn)… а (nil let ((l (list nil 'progn)…
-
(cons cons first rest)=(cons setfirst first),(cons setrest rest)
(cons cons another-cons)=(cons setf another-cons)
-
(consthis setf consarg)=(consthis setfirst(consarg first)),(consthis setrest(consarg rest)) - заменяет части ячейки на новые, предоставленные consarg. Использование данной операции чревато ошибками программирования.
-
(list += {list}) - все списки объединяет, разрушает их структуру, кроме последнего. Возвращает объединённый список.
-
('list1 set '(a b))
('list2 set '(c d))
('list3 set '(e f))
(list1 += list2 list3)
list1→ (a b c d e f)
list2→ (c d e f)
-
(list for* symbol {body}) – пошагово локальной переменной symbol присваиваются элементы списка list, вычисляются пошагово формы body. Возвращается последний результат формы body.
-
('(1 2 3) for* i (cout writeln "i=" i "..")) →
i=1..
i=2..
i=3..
-
(list for symbol {body}) – параллельно локальным переменным symbol (для каждого процесса своя переменная symbol) присваиваются элементы списка list, при каждом значении вычисляются пошагово формы body.
-
('(1 2 3) for i (cout write " i+1=" (i + 1)) (i + 1)) →
i+1=2 i+1=4 i+1=3
→ nil
(envir assoc who [testeql]) - возвращает пару (obj . obj-value) из списка envir=(( a . 1)(b . 2)…( c . 3)) при которой who=obj если эта пара там существует, и nil - при отсутствии значения. При поиске используются предикаты равенства объектов testeql, по умолчанию: =
-
(envir rassoc who [testeql]) - возвращает пару (obj . obj-value) из списка envir=(( a . 1)(b . 2)…( c . 3)) при которой who=obj-value если эта пара там существует, и nil - при отсутствии значения. При поиске используются предикаты равенства объектов testeql, по умолчанию: =
-
('((1 . a)(2 . b)(3 . c)) rassoc 'c) → (3 . c)
(nil acons x y a-list)=(nil cons (nil cons x y) a-list) – добавляет в ассоциативный список пару (x . y), результат надо сохранять: ('a-list set (nil acons x y a-list))
-
(а-список pairlist ключи-список данные-список) – возвращает ассоциативный список из списка ключей и списка данных, а также добавляет старый а-список.
-
('((a . 1)) pairlist '(b c) '(2 3)) → ((b . 2) (c . 3) (a . 1))
(list = list … list) - сравнения содержания всех списков
(list <> l1 … ln) - ни один список li не равен list.
-
(list contain item [test]) – находится ли item в списке. По умолчанию test равен =
-
('(a b c d) contain 'c) → (c d)
(list vector) - возвращает новый вектор с элементами списка
(nil vector) - возвращает новый пустой вектор #()
-
(list map fn [{list}]) - применение функции fn к элементам list и элементам [{list}]. Значением переменной fn может быть имя или лямбда список. Возвращается список результатов. Вычисления производятся параллельно.
-
('(1 2 3 4) map '- '(1 1 1 1)) → (0 1 2 3)
('(1 2 3 4) map '-) → (-1 -2 -3 -4)
('(1 2.3 x "4") map '(lambda () (nil numberp this))) → (1 2.3 false false)
-
(list mapc fn [{list}]) - применение функции fn к элементам list и элементам [{list}]. Значением переменной fn может быть имя или лямбда список. Не возвращает значение. Используется для получения побочного эффекта. Вычисления производятся параллельно.
-
('(a b c) mapc '(lambda(v &env env)(this set v env)) '(1 2 3)) → nil
a → 1
b → 2
c → 3
(list count [{x}]) - количество элементов списка удовлетворяющих запросу (elt = [{x}]).
(list count-if fn [{x}]) - количество элементов списка удовлетворяющих запросу (elt fn [{x}]).
-
(list find [{x}]) - возвращается списочная ячейка, содержащая элемент удовлетворяющий условию (elt = [{x}]).
-
('(1 2 3) find 2) → (2 3)
('(1 2 3) find 4) → nil
-
(list find-if fn [{x}]) - возвращается списочная ячейка, содержащая элемент удовлетворяющий условию (elt fn [{x}]).
-
('(1 2 3) find-if 'evenp) → (2 3)
('(1 2 3) find-if '> 10) → nil
-
(list replace old new) - заменяет элементы списка удовлетворяющие условию (elt = old) на новое значение new.
-
(list replace-if fn new) - заменяет элементы списка удовлетворяющие условию (elt fn) на новое значение new.
Вектор
(vector elt i [j … [k]]) - возвращает элемент вектора vectori,j,…,k. Элементы вектора нумеруются от 0 до size-1.
-
(vector size) - возвращает длину вектора vector
-
(#() size)→0
(#(1) size)→1
-
(vector resize size [new]) – подправляет длину вектора размером size, если нужно добавить размер, дополнительные элементы инициализируются new
-
(vector clear)=(vector resize 0)
-
(vector setelt i j … k new) – устанавливает новое значение по индексам i,j,…,k на new. Возвращает подправленный вектор vector
-
(#(1 #(2 3) 4) setelt 1 1 'new) → #(1 #(2 new) 4)
-
(vector reverse) – создаёт новый вектор с обращением порядка элементов
-
(#(1 2 3) reverse) → #(3 2 1)
-
('vector newobject dimlist [init]) - создаёт вектор размерности dimlist1×dimlist2×…×dimlistn с элементами init.
-
('vector newobject '(2 2) 0) → #(#(0 0) #(0 0))
-
('vector newobject number [init]) - создаёт одномерный вектор размерности number с элементами init.
-
('vector newobject 2 0) → #(0 0)
-
('vector newobject another-vector)=(another-vector copy)
('vector newobject another-vector integer-index-start)
('vector newobject another-vector integer-index-start integer-size)
('vector newobject) → #()
-
(vector merge {vector}) - возвращает объединение векторов vector. Все вектора не разрушаются
-
(#(1 2) merge #() #(3 4)) → #(1 2 3 4)
-
(vector part a [n]) - возвращает новый вектор размера n с элементами по индексам с a-го. Если параметр n - не задан, то копирование происходит до конца.
-
(#(1 2 3 4) part 1 2) → #(2 3)
(#(1 2 3 4) part 1) → #(2 3 4)
-
(vector push item) – item добавляется в вектор vector, возвращается vector
(vector push item n) – item добавляется n раз в вектор vector, возвращается vector
-
('x set #(1 2))(x push 3)→#(1 2 3)
x=#(1 2 3)
('x set #(1 2))(x push 3 2)→#(1 2 3 3)
x=#(1 2 3 3)
-
(vector pop) - удаляет из вектора последний элемент и возвращает его.
-
('y set #(1))
(y push 2) → #(1 2)
(y pop) → 2
y → #(1)
-
(vector contain item [test]) – находится ли item в векторе. По умолчанию test равен =
-
(#(a b c d) contain 'c) → 2
(#(a b c d) contain 'e) → false
-
(vector for* symbol {body}) – пошагово локальной переменной symbol присваиваются элементы вектора vector, вычисляются пошагово формы body. Возвращается последний результат формы body.
-
(#(1 2 3) for* i (cout writeln "i=" i "..")) →
i=1..
i=2..
i=3..
-
(vector for symbol {body}) – параллельно локальным переменным symbol (для каждого процесса своя переменная symbol) присваиваются элементы вектора vector, при каждом значении вычисляются пошагово формы body.
-
(#(1 2 3) for i (cout write " i+1=" (i + 1)) (i + 1)) →
i+1=3 i+1=2 i+1=4
→ nil
(vector copy) - возвращает новый вектор.
(vector copy-matrix) - возвращает новый вектор. Если элемент - вектор, то он также копируется.
-
(vectorthis setf vectorarg) - полная замена элементов вектора на новые, предоставленные vectorarg.
(vector vector dimlist [init])≈(vector setf ('vector newobject dimlist [init]))
(vector vector number [init])≈(vector setf ('vector newobject number [init]))
(vector vector another-vector)=(vector setf another-vector)
-
(vector vector another-vector integer-index-start) - даёт значения начиная со стартовой позиции.
-
(#() vector #(1 2 3) 1) → #(2 3)
-
(vector vector another-vector integer-index-start integer-size) - даёт значения начиная со стартовой позиции, с определённым размером вектора.
-
(#() vector #(1 2 3) 1 1) → #(2)
-
(matrix transpose) - возвращает новую матрицу с переставленными элементами
-
(#(#(1 2) #(3 4)) transpose) → #(#(1 3) #(2 4))
-
(vector + {vector}) - сложение векторов чисел, матриц и других объектов, у которых существует метод +.
-
(#(1 2) + #(3 -4)) → #(4 -2)
(#(#(1 2) #(3 4)) + #(#(1 0) #(0 -1))) → #(#(2 2) #(3 3))
-
(vector - {vector}) - вычитание векторов чисел, матриц и других объектов, у которых существует метод -. Возвращает новый вектор.
-
(#(1 2) - #(3 -4)) → #(-2 6)
(#(1 2) -) → #(-1 -2)
(#(#(1 2) #(3 4)) - #(#(1 0) #(0 -1))) → #(#(0 2) #(3 5))
-
(vector * number … ) - умножение элементов вектора на число number, возвращает новый вектор.
(vector * vector) - скалярное произведение.
-
(#(1 -2) * 2 -3) → #(-6 12)
(#(1 2) * #(-2 1)) → 0
Вектор векторов подразумевает матрицу. Матрица задаётся построчно. Первый элемент вектора это первая строка матрицы, второй - вторая, и т.д. Операции +, -, * задаются в математическом смысле.
| R=M+N | Ri,j=Mi,j+Ni,j |
| R=M-N | Ri,j=Mi,j-Ni,j |
| R=m*N | Ri,j=m*Ni,j |
-
(vector remove elt) – удаляет из вектора элементы удовлетворяющие равенству (elt = vectori), возвращает новый вектор без данных элементов
-
(#(1 2 3) remove 2) → #(1 3)
-
(vector = v1 … vn) – равенство vector=v1=…=vn
-
У элементов вектора должен быть метод <>.
-
(vector <> obj1 … objn) - ни один аргумент obji не равен vector.
-
У элементов вектора должен быть метод <>.
-
(vector list) - возвращает новый список элементов вектора
-
(#(1 2) list) → (1 2)
-
(vector empty) - предикат пустого вектора
-
(#(1 2) empty) → false
(#() empty) → #()
-
(vector insert integer-place x) - вставляет x на место integer-place.
-
(#(1 2) insert 1 7) → #(1 7 2)
-
(vector += [{vector}])≈(vector setf (vector + [{vector}]))
-
(vector -= [{vector}])≈(vector setf (vector - [{vector}]))
-
(vector *= [{number}])≈(vector setf (vector * [{number}]))
-
(vector swap integer-index integer-index) - меняет местами элементы вектора. Возвращает вектор.
-
(vector first)=(vector elt 0)
-
(vector last)=(vector elt ((vector size) - 1))
-
(vector map fn [{vector}]) - применение функции fn к элементам vector и элементам [{vector}]. Значением переменной fn может быть имя или лямбда список. Возвращается вектор результатов. Вычисления производятся параллельно.
-
(#(1 2 3 4) map '- #(1 1 1 1)) → #(0 1 2 3)
(#(1 2 3 4) map '-) → #(-1 -2 -3 -4)
(#(1 2.3 x "4") map '(lambda () (nil numberp this))) → #(1 2.3 false false)
-
(vector mapc fn [{vector}]) - применение функции fn к элементам vector и элементам [{vector}]. Значением переменной fn может быть имя или лямбда список. Не возвращает значение. Используется для получения побочного эффекта. Вычисления производятся параллельно.
-
(#(a b c) mapc '(lambda(v &env env)(this set v env)) #(1 2 3)) → nil
a → 1
b → 2
c → 3
(vector count [{x}]) - количество элементов вектора удовлетворяющих запросу (elt = [{x}]).
(vector count-if fn [{x}]) - количество элементов вектора удовлетворяющих запросу (elt fn [{x}]).
-
(vector find [{x}]) - возвращается индекс элемента вектора удовлетворяющий условию (elt = [{x}]).
-
(#(1 2 3) find 2) → 1
(#(1 2 3) find 4) → nil
-
(vector find-if fn [{x}]) - возвращается индекс элемента вектора удовлетворяющий условию (elt fn [{x}]).
-
(#(1 2 3) find-if 'evenp) → 1
(#(1 2 3) find-if '> 10) → nil
-
(vector replace old new) - заменяет элементы вектора удовлетворяющие условию (elt = old) на новое значение new.
-
(vector replace-if fn new) - заменяет элементы вектора удовлетворяющие условию (elt fn) на новое значение new.
-
(vector sort) - сортировка элементов вектора (метод порядка <).
-
(#(1 2 3 4 3 2 1) sort) → #(1 1 2 2 3 3 4)
Строки
(str size) - возвращает длину строки
('string newobject size [char]) - создаёт строку размера size. Заполняется буквами char, по умолчанию пробелами.
('string newobject another-string)=(another-string copy)
('string newobject) → ""
-
(str1 + {strn|char}) - возвращает объединение строк str… Все строки не разрушаются
-
('x set "Year")("New" + " " x #\!) → "New Year!"
(str0 = str1 … strn) – равенство str0=str1=…=strn
(str <> st1 … stk) - ни одна строка sti не равна str
(str0 < str1 … strn), (str0 > str1 … strn), (str0 <= str1 … strn), (str0 >= str1 … strn) – по коду букв(словарному порядку)
(str min str … str), (str max str … str) – минимальная/максимальная
-
(obj string) -– создаёт строку, которая представляет собой строковое представление объекта obj.
Поддерживается преобразование типов: nil, false, true, char, number, symbol.
-
(('(1) rest) string) → "NIL"
((2 / 4) string) → "0.5"
('abcd string) → "abcd"
-
(str elt ind) – буква на месте ind.
-
Если ind превышает размер строки возвращается nil.
-
(str setelt ind newchar) – ставит другую букву newchar на месте ind. Возвращает подправленную строку str.
-
Если ind превышает размер строки, то строка увеличивает свой размер с добавлением пробелов.
-
(str part ind [n]) – создаёт новую строку размера n с буквами по индексам начиная с ind. Если не указано n - копирования происходит до конца.
-
("abcd" part 1 2) → "bc"
("abcd" part 1) → "bcd"
(str lower) – возвращает новую строку с буквами в нижнем регистре
(str upper) – возвращает новую строку с буквами в верхнем регистре
(str read) - конвертирует строку в объект Лиспа (встроенный синтаксический анализатор)
-
(string for* symbol {body}) – пошагово локальной переменной symbol присваиваются элементы строки string, вычисляются пошагово формы body. Возвращается последний результат формы body.
-
("(1 2 3)" for* i (cout writeln "i=" i "..")) →
i=(..
i=1..
i= ..
i=2..
i= ..
i=3..
i=)..
-
(string for symbol {body}) – параллельно локальным переменным symbol (для каждого процесса своя переменная symbol) присваиваются элементы строки string, при каждом значении вычисляются пошагово формы body.
-
("abc" for i (cout write " code(i)=" (i code)) (i code)) →
code(i)=99 code(i)=98 code(i)=97
→ nil
-
(string contain char [test]) – находится ли char в строке. По умолчанию test равен =
-
("abcd" contain #\c) → 2
("abcd" contain #\e) → false
-
(string list) – возвращает список букв.
-
("Abcd" list) → (#\A #\b #\c #\d)
-
(string vector) – возвращает вектор букв.
-
("Abcd" vector) → #(#\A #\b #\c #\d)
-
(string remove elt) – удаляет из строки элементы удовлетворяющие равенству (elt = stringi), возвращает новую строку без данных элементов
-
("ABBA" remove #\B) → "AA"
(string copy) - возвращает новую строку.
-
(string setf string) - физически заменяет строку новым значением. Использование данной операции чревато ошибками программирования.
-
('x set "abc") → "abc"
('y set (nil list x x x)) → ("abc" "abc" "abc")
(x setf (x upper)) → "ABC"
y → ("ABC" "ABC" "ABC")
Для избежания порчи работающей программы следует пользоваться функцией копирования:
(nil let ((x "")) … → (nil let ((x ("" copy))) …
('x set "abc") → (x setf "abc")
(nil setq x "abc") → (x setf "abc")
(string string number [char])≈(string setf ('string newobject number [char]))
(string string another-string)=(string setf another-string)
-
(string resize newsize [char]) - изменяет размер строки на newsize. Новые буквы определяются с помощью char. По умолчанию пробелами.
-
(string += [{char|string}])≈(string setf (string + [{char|string}]))
-
(string replace index size char|string) - заменяет участок строки начиная с index по index+size-1 на новую строку или букву.
-
("aha" replace 1 1 "bb") → "abba"
-
(string replace char char) - заменяет буквы на новые.
-
("aha" replace #\a #\A) → "AhA"
-
(string replace-if method char) - заменяет буквы удовлетворяющие результату работы метода method на новое значение char.
-
("10x15" replace-if '(lambda()(nil not (this digitp))) #\space) → "10 15"
(string count [{x}]) - количество элементов строки удовлетворяющих запросу (elt = [{x}]).
(string count-if fn [{x}]) - количество элементов строки удовлетворяющих запросу (elt fn [{x}]).
-
(string find [{x}]) - возвращается индекс элемента строки удовлетворяющий условию (elt = [{x}]).
-
("abcE" find #\E) → 3
("abcE" find #\e) → nil
-
(string find-if fn [{x}]) - возвращается индекс элемента строки удовлетворяющий условию (elt fn [{x}]).
-
("abcE" find-if 'upperp) → 3
("abcE" find-if 'digitp) → nil
Буквы
(char0 = char1 … charn) – равенство char0=char1=…=charn
(char <> char1 … charn) – ни один chari не равен char
(char0 <= char1 … charn) – char0≤char1≤…≤charn
(char0 < char1 … charn) – char0<char1<…<charn
(char0 > char1 … charn) – char0>char1>…>charn
(char0 >= char1 … charn) – char0≥char1≥…≥charn
(char min char … char), (char max char … char) – минимальный/максимальный
(number char) - возвращает букву с кодом number
(ch code) - возвращает код буквы ch
(ch alphap) - буква в верхнем или нижнем регистре #\a…#\z #\A…#\Z
(ch upperp) - буква в верхнем регистре #\A…#\Z
(ch lowerp) - буква в нижнем регистре #\a…#\z
(ch digitp) - #\0…#\9
(ch spacep) - символ-разделитель
(ch controlp) - управляющий символ (ASCII 0…31 или 127)
(ch printp) - можно ли распечатать
(ch upper) - эквивалент буквы в верхнем регистре
(ch lower) - эквивалент буквы в нижнем регистре
-
(charthis setf chararg)=(charthis char chararg) - изменяет значение буквы на новое, предоставленные chararg. Использование данной операции чревато ошибками программирования.
-
(char copy) - возвращает новую букву.
-
('char newobject char)
('char newobject) - новая буква пробел.
Замки и сигналы
Используется для монопольного доступа к важным участкам программы.
('lock newobject) - создаёт замок.
(lock progn {body}) - устанавливается замок и пошагово вычисляет задачи body. Если замок был закрыт, то ожидается его открытие.
(lock try task-locked task-free) - при успешной установке замка вычисляется задача task-locked, иначе task-free.
(lock set) - устанавливается замок. Если замок был закрыт, то ожидается его открытие. Не рекомендуется использовать. Большая опасность ошибок при программировании.
(lock free) - открытие замка. Не рекомендуется использовать. Большая опасность ошибок при программировании.
('signal newobject) - создаёт объект сигнал.
-
(signal wait [lock]) - ожидает сигнал. Если предоставлен замок, то он отключается и при получении сигнала устанавливается.
-
(lock progn
…
(signal wait lock)
…)
(signal send) - посылает сигнал.
Объектно-ориентированное программирование
Создана эта техника программирования для-того чтобы люди смогли физически понять очень большую программу. И объектом называется часть кода, у которого есть несколько функций общения с другой частью программы.
Все встроенные типы имеют свой класс, можно узнать его имя с помощью функции (nil type-of obj).
(имя-класса defclass) – минимальное пока ещё пустое определение. Возвращается имя класса.
-
(имя-класса defclass pclass1 … pclassn) - определение класса с родительскими классами pclass1…pclassn
-
Перегрузка методов/статических переменных происходит слева направо:
методы из pclassn перегружают pclassn-1 ,… методы данного класса перегружают все остальные.
-
(имя-класса defvar [{varname}]) - добавляет поля к классу. Символы varname не вычисляются. Возвращается имя класса.
-
Внешнего доступа до переменных объекта нет. Можно только с помощью методов.
(имя-класса setstatic varname startvalue) - добавляет/изменяет статическое поле класса. Все аргументы вычисляются.
-
(имя-класса defmethod methodname (… args …) {methodbody}) - добавляет метод к классу. Задачи methodbody будут вычислятся пошагово.
-
В отличие от большинства языков, возможно динамическое изменение методов в процессе работы программы - и все существующие объекты будут соответственно менять своё "поведение".
(имя-класса defmacro macroname (… args …) {macrobody}) - добавляет макрос к классу.
-
Определить закрытую функцию для работы внутри объекта можно с помощью статических переменных, определённых как ламбда список.
-
('className setstatic 'functionName '(lambda ( … arguments … ) function-body))
-
Чтобы запустить такую функцию нужно использовать funcall:
-
(nil funcall this functionName … arguments … )
(имя-класса getmethod methodname) - возвращает определение метода. methodname вычисляется. Если такого метода нет, то nil.
(имя-класса getstatic staticname) - возвращает значение статического поля данного класса. staticname вычисляется.
(имя-класса getclass) - возвращает определение класса. Если такого класса нет, то nil.
Использование:
(obj) → obj
(obj method arg1 … argn) - вызов метода method объекта obj.
-
(имя-класса newobject {args}) - создаёт новый объект данного класса.
-
Если был создан метод с именем класса запускается этот конструктор с аргументами {args}.
(object copy) - возвращает новый объект.
Работа с потоками ввода/вывода
Есть три стандартных потока, которые используются функциями по умолчанию. Они хранятся в переменных cin, cout и cerr.
(stream write obj … obj) - выводит значения obj в удобном для просмотра человека виде. Возвращается поток.
(stream princ obj … obj) - выводит значения obj в виде, пригодном для ввода в интерпретатор. Возвращается поток.
(stream writeln obj … obj) - вызывает функцию write и делает перевод строки. Возвращается поток.
(stream print obj … obj) - вызывает функцию princ и делает перевод строки. Возвращается поток.
-
(string open [{mode}]) - открывает файл с именем string и возвращает связанный с ним поток. Режим потока задаётся с помощью символов mode. По умолчанию считается на чтение.
-
-
Режим mode может задаваться символами:
-
| in | на чтение |
| out | на запись |
| trunc | урезать файл до нулевой длины |
| app | добавление в конец |
| ate | открытие и поиск конца файла |
(string create)=(string open 'out 'trunc) - создаёт новый пустой файл с именем string и возвращает связанный с ним поток для записи.
(stream close) - закрывает поток.
(stream read) - читает из потока строковое представление объекта и возвращает объект Lisp2D.
-
(stream read-line [string]) - читает строку символов из потока и возвращает строку без символа перевода строки. Если предоставлена строка string результат будет помещён туда.
-
(cin read-line) - из консоли
(stream read-char [char]) - читает 1 символ из потока. Если предоставлен char результат будет помещён туда.
(stream read-byte [number]) - читает 1 байт из потока и возвращает целое число. Если предоставлено число number результат будет помещён туда.
(stream listen) - возвращает true когда в потоке не обнаружен символ конца файла, иначе - false
(stream openp) - возвращает stream если поток открыт, иначе - false.
(stream terpri) - пишет символ конца строки в поток stream
(stream write-byte number) - пишет в поток 1 байт
(stream tellr) - возвращает целое число - позицию чтения потока
(stream tellw) - возвращает целое число - позицию записи в поток
Разные названия функций нужны для работы с потоками чтения+записи
(stream seekr number [mode]) - устанавливает позицию чтения потока
-
(stream seekw number [mode]) - устанавливает позицию записи в поток
-
-
Первый байт имеет позицию 0, последний size-1
Символ mode задаёт режим отсчёта позиции:
-
| beg | от начала текущего файла |
| cur | от текущей позиции |
| end | от конца текущего файла |
(stream flush) - очищает буфер потока.
Окна
-
(nil window width height) – создаёт окно шириной width и высотой height. Возвращает объект для работы с окном.
(win close) – закрывает окно
Координаты определяются слева направо и сверху вниз.
(nil mapwindow width height) – создаёт окно без вывода на экран.
(window-mapped open) – отображает окно на дисплее.
(window openp) – открыто ли окно.
(window hide) – закрывает окно, оставляя изображение.
Прорисовка изображения с закрытым окном намного быстрее.
(win rename string) – даёт заголовок окну.
(win move x y) – переносит окно на координату (x y)
(win resize w h) – изменяет размеры окна и матрицу цветов
-
(nil display-size) – возвращает размеры дисплея в пикселях как список чисел (width height)
-
(nil display-size) → (1280 1024)
-
(nil display-sizemm) – возвращает размеры дисплея в милиметрах как список чисел (width height)
-
(nil display-sizemm) → (342 271)
(win width) - ширина окна в пикселях
(win height) - высота окна в пикселях
(window listen) - опрашивает поток нажатий на кнопки клавиатуры при работе в окне window. Возвращает код буквы или false. Из очереди нажатий не извлекается.
(window read-char [char]) - берёт букву из потока нажатий на кнопки клавиатуры. Если очередь пуста то ожидает. Возвращает букву. Если предоставлен char результат будет помещён туда.
-
(window read-keyb [number]) - Возвращает число, код нажатой клавиши на клавиатуре. Если очередь пуста то ожидает. Если предоставлено число number результат будет помещён туда.
-
Есть глобальные переменные с кодом основных клавиш:
xk-enter, xk-home, xk-end, xk-left, xk-right, xk-up, xk-down, xk-page-up, xk-page-down, xk-insert, xk-delete, xk-caps-lock, xk-shift-l, xk-shift-r, xk-control-l, xk-control-r, xk-alt-l, xk-alt-r, xk-f1, xk-f2, xk-f3, xk-f4, xk-f5, xk-f6, xk-f7, xk-f8, xk-f9, xk-f10, xk-f11, xk-f12, xk-backspace, xk-undo, xk-num-lock, xk-kp-multiply, xk-space, xk-numbersign, xk-question
(window keyb-event) - опрашивает сигнал клавиатуры на нажатие/отжатие клавиш клавиатуры. Возвращает nil или (code true|false).
(window pointer-coord) - возвращает локальные координаты указателя как список (x y).
-
(window button-event) - возвращает событие нажатия на кнопки указателя как список (номер-кнопки true|false x y) | NIL.
-
Номер кнопки это число 1…6. true|false - нажатие/отжатие. x,y - координата указателя при этом событии. При отсутствии события возвращается NIL
(win getpixel x y) – возвращает цвет точки как (r g b), при координатах за пределами окна возвращает (0 0 0)
(win draw-pixel col|(colr colg colb) x y x y … x y) – рисует точки на экране заданным цветом [0…1] Если цветом поставлено число, то будет серым оттенком, иначе ([0…1] [0…1] [0…1])=(red green blue)
У координаты x берётся только целая часть, находятся от 0 до width-1
У координаты y берётся только целая часть, находятся от 0 до height-1
Такой смысл координат только для работы с пикселями.
У функций прорисовки не для работы с пикселями координаты в окне это числа с плавающей запятой от 0 до width(height). Запуск функций прорисовки при координатах за этими пределами не приводит к ошибке а игнорируется.
(win draw-square col|(colr colg colb) x y w h … x y w h) – рисует закрашенные прямоугольники заданным цветом [0…1] Если цветом поставлено число, то будет серым оттенком, иначе ([0…1] [0…1] [0…1])=(red green blue)
Начальным углом обозначается x y , ширина и высота w h.
Координаты для прорисовки в окне задаются числами с плавающей запятой от 0 до width(height). Чтобы закрасить всё окно в один цвет можно сделать это так:
(win draw-square col 0 0 w h).
Чтобы нарисовать линии по краю окна можно использовать:
(win draw-square col 0 0 1 h 0 0 h 1 0 h w -1 w 0 -1 h)
Нарисовать одну точку:
(win draw-square col x y 1 1)
Если координаты не целые функция draw-square сглаживает изображение. Поэтому можно прорисовать очень много маленьких прямоугольников и это дает эффект полупрозрачности.
(nil let ((size 200) halfsize shift w (map 10) size/map)
(nil setq
halfsize (size / 2)
shift (size / 20)
size/map (size / map)
w (nil window (size + 1) (size + 1)))
((map + 1) for i
(w draw-square '(0 1 1)
0 (i * size/map) (size + 1) 1
(i * size/map) 0 1 (size + 1)))
(halfsize for i
(w draw-square '(1 0 0)
(i - shift) (i + shift) halfsize (i / halfsize)))
(halfsize for i
(w draw-square '(0 0 1)
(i + shift) (i - shift) (i / halfsize) halfsize))
(cout write "press a key...")
(w read-keyb)
(w close))

(win draw-line col|(colr colg colb) radius x y x y … x y) - рисует линии заданным цветом [0…1]. Если цветом поставлено число, то будет серым оттенком, иначе ([0…1] [0…1] [0…1])=(red green blue). radius - задаёт толщину линии, точнее радиус.
Пространство имён
Предназначено оно для ослабления перегрузки имён функций и констант.
Рекомендуется определять функции и переменные в личном пространстве, так как если пользоваться другими программами и они переопределят функцию с таким-же названием - то доступиться до неё нельзя.
('name namespace {body}) - подключает все константы и функции определённые в данном пространстве имён и выполняются пошагово задачи body.
Определять эти константы очень просто:
('version1 namespace
('conste letset 1000)
(nil defmethod m (x)
(cout write "x=" x)))
('version1 namespace
(nil m conste))
Извне этого пространства невозможно ими пользоваться:
conste → error
(nil m 1) → error
Почти все функции языка определены в пространстве имён std и можно вызывать эти функции с перегруженным определением другими программами так:
('another namespace
('number defmethod ! () (cout write "another"))
…
('std namespace
(3 !) → 6
…)
…)
Дата и время
-
(nil daylightp) - время часового пояса должно корректироваться с использованием летнего времени.
-
(nil daylightp) → TRUE
-
(nil setdaylightp flag) - установка флага того, что время часового пояса должно корректироваться с использованием летнего времени
-
(nil timezone) - смещение часового пояса в секундах
-
((nil timezone) / 60 60) → -2
-
(nil settimezone sec) - установка смещении часового пояса в секундах
-
(nil tzname) - строки, характеризующие часовой пояс
-
(nil tzname) → ("EET" "EEST")
-
(nil settzname string string) - установка строк, характеризующих часовой пояс
-
(nil time {form}) - вычисляет пошагово формы form и возвращает время выполнения в секундах.
-
(nil time 1) → 0.00088
-
(nil localtime) - возвращает объект класса time.
-
(nil localtime) → Time(2008 4 19 17 51 28.0957 6 109 true)
Определён класс объектов time, у которых есть методы.
-
(time year)
(time setyear integer)
-
(time month) → 1…12
(time setmonth integer)
-
(time day) → 1…31
(time setday integer)
-
(time hour) → 0…23
(time sethour integer)
-
(time minutes) → 0…59
(time setminutes integer)
-
(time seconds) → 0…59.999999
(time setseconds number)
-
(time weekday) → 0…6
-
0 = воскресенье
-
(time yearday) → 0…365
-
(time dstp) - время часового пояса должно корректироваться с использованием летнего времени. Возвращает true|false|nil.
-
(time number) - время в секундах прошедших с 1 января 1970 года по UTC (Гринвичу). Используется для синхронизации по времени.
-
(time string)
-
((nil localtime)string) → "Sun Apr 20 19:43:08 2008"
-
(nil uptime) - время в секундах, прошедшее с момента загрузки системы
-
(nil uptime) → 8301
-
('time newobject) → Time(1970 1 1 3 0 0 4 0 false)
('time newobject time)=(time copy)
('time newobject number) - установка времени, исходя из нулевой точки: 1 января 1970г. UTC (Greenwich)
-
(time time time)=(time setf time)
(time time number) - установка времени, исходя из нулевой точки: 1 января 1970г. UTC (Greenwich)
-
(time setf time)
Каталоги
Для работы с каталогами существует класс dir.
-
('dir newobject)=('dir newobject ".")
('dir newobject dir)=(dir copy)
('dir newobject string-path)
(dir dir dir)=(dir setf dir)
(dir dir string-path)=(dir open string-path)
(dir open string-path) - открытие каталога.
(dir openp) - открыт или нет.
(dir close) - закрытие каталога.
(dir read) - возвращает строку или nil(если файлы закончились).
-
Программа вывода содержимого текущего каталога:
-
(nil let (s (d ('dir newobject)))
(nil do-while
(nil if ('s set (d read))
(cout writeln s))))
(dir rewind) - переход в начало каталога.
-
(dir seek integer-loc) - переход к требуемому местоположению.
-
integer-loc - это НЕ порядковый номер элемента каталога.
-
(dir tell) - получить текущую позицию в каталоге.
-
Позиция - это НЕ порядковый номер элемента каталога.
- (string chdir) - делает текущим заданный каталог.
- (nil getcwd) → "/home/alex/lisp2d"
(".." chdir) → "/home/alex"
(string rmdir) - удаляет пустой каталог.
- (nil getcwd) - строка, имя текущего каталога.
- (nil getcwd) → "/home/alex/lisp2d"
-
(string-name mkdir [integer-mode]) - создаёт каталог с правами доступа (0x000-0x1ff). По умолчанию полный доступ.
-
mode=owner(3bits) group(3bits) other(3bits)=rwxrwxrwx
Системные функции
-
(string-filename system [{string-argument}]) - даёт задачу операционной системе. Возвращается код завершения задачи: 0…255 или nil.
-
("ls" system "--help") - консольный запрос.
("mc" system) - запускает программу.
-
(string getenv) - переменная среды
-
("USER" getenv) → "alex"
("USEr" getenv) → NIL
("HOME" getenv) → "/home/alex"
-
(string setenv string) - устанавливает переменную среды
-
("ABC" setenv "DEF")
("ABC" getenv) → "DEF"
(string unsetenv) - сброс значения переменной среды
(nil geteuid) - число, номер идентификатора пользователя
(nil getegid) - число, номер идентификатора группы
Пользователь root имеет номер идентификатора 0
(nil getuid) - число, реальный номер идентификатора пользователя
(nil getgid) - число, реальный номер идентификатора группы
Пользователь root имеет номер идентификатора 0
(nil sysname) - строка, имя операционной системы, например "Linux"
-
(nil release) - строка, номер версии ядра операционной системы
-
(nil release) → "2.6.8.1-12mdk"
-
(nil version) - строка, модификация ядра операционной системы
-
(nil version) → "#1 Fri Oct 1 12:53:41 CEST 2004"
-
(nil machine) - строка, платформа на которой работает система
-
(nil machine) → "i686"
-
(nil nodename) - строка, имя компьютера
-
(nil nodename) → "localhost"
-
(nil totalram) - общий объём оперативной памяти в байтах
- ((nil totalram) / 0x400) → 256376
- (nil freeram) - свободный объём оперативной памяти в байтах
- ((nil freeram) / 0x400) → 61812
- (string accessf) - проверка доступа или существования файла
- ("Makefile" accessf) → "Makefile"
("MakeFile" accessf) → FALSE
- (string accessx) - проверка исполнимости файла
- ("lisp2d" accessx) → "lisp2d"
("lisp2d.cpp" accessx) → FALSE
- (string accessr) - проверка доступа на чтение файла
- ("lisp2d" accessr) → "lisp2d"
("lisp2dd" accessr) → FALSE
- (string accessw) - проверка доступа на запись в файл
- ("lisp2d" accessw) → "lisp2d"
("lisp2dd" accessw) → FALSE
- (string totalsize) - размер файла в байтах
- ("lisp2d" totalsize) → 354410
("lisp2dd" totalsize) → 0
- (string uid) - число, идентификатор пользователя файла
- ("lisp2d" uid) → 1001
("lisp2dd" uid) → 0
- (string gid) - число, идентификатор группы файла
- ("lisp2d" gid) → 100
- (string-filename setuid number) - устанавливает идентификатор пользователя файла.
- (string-filename setgid number) - устанавливает идентификатор группы файла.
- (string-filename setluid number) - устанавливает идентификатор пользователя ссылки, а не объекта ссылки.
- (string-filename setlgid number) - устанавливает идентификатор группы ссылки, а не объекта ссылки.
- (string device) - число, идентификатор устройства файловой системы.
- ("lisp2d" device) → 2056
- (string rdevice) - число, идентификатор устройства (для специального файла).
- ("lisp2d" rdevice) → 0
- (string inode) - число, номер индексного узла.
- ("lisp2d" inode) → 1714521
- (string links) - число, количество жёстких ссылок.
- ("lisp2d" links) → 1
-
(string-filename accesstime) - время последнего обращения. Возвращает объект класса time.
-
(string-filename modifytime) - время последнего изменения. Возвращает объект класса time.
-
(string-filename changetime) - время последнего изменения индексного узла. Возвращает объект класса time.
-
(string-filename settime [time-access [time-modify]]) - устанавливает время доступа и время изменения файла. При отсутствии аргументов устанавливается текущее время.
(string-oldpath link string-newpath) - создание жёсткой ссылки на файл, не являющейся каталогом.
(string-oldpath symlink string-newpath) - создаёт символическую ссылку.
(string-path readlink) - возвращает строку содержимого файла символической ссылки.
(string unlink) - удаляет файл/снимает членство в каталоге
- (string rename string) - изменяет имя или позицию файла/каталога
- ("readme" rename "doc/readme") → "doc/readme"
- (string ls) - чтение содержимого каталога, возвращает список имён.
- ("." ls) → ("." ".." "tmp" ".desktop" "work.cpp" …)
(".." ls) → ("." ".." "alex")
(nil nprocs) - число, количество процессоров системы
(string truncate size) - изменяет размер файла с именем string. При неудачном изменении возвращается nil.
(number seteuid) - устанавливает действующий идентификатор пользователя. Возвращает успех: true или false.
-
(number setuid) - устанавливает реальный идентификатор пользователя. Возвращает успех: true или false. Работает только от прав суперпользователя.
-
(1002 setuid) → false
(number setegid) - устанавливает действующий идентификатор группы. Возвращает успех: true или false.
-
(number setgid) - устанавливает реальный идентификатор группы. Возвращает успех: true или false. Работает только от прав суперпользователя.
-
(1002 setgid) → false
-
(string blocksize) - оптимальный размер блока для операций ввода-вывода. При неудаче возвращается nil.
-
("." blocksize) → 4096
-
(string vfsblocksize) - оптимальный размер блока для операций ввода-вывода. При неудаче возвращается nil.
-
("." vfsblocksize) → 4096
-
(string frsize) - фундаментальный размер блока. При неудаче возвращается nil.
-
("." frsize) → 4096
-
(string blocks) - общее число блоков по 512 байт. При неудаче возвращается nil.
-
("." blocks) → 16
-
(string vfsblocks) - общее число блоков. При неудаче возвращается nil.
-
("." vfsblocks) → 4046090
-
(string bfree) - количество свободных блоков для суперпользователя. При неудаче возвращается nil.
-
("." bfree) → 3308030
-
(string bavail) - количество свободных блоков для обыкновенного пользователя. При неудаче возвращается nil.
-
("." bavail) → 3102499
-
(string files) - общее количество индексных узлов. При неудаче возвращается nil.
-
("." files) → 2056320
-
(string ffree) - количество свободных индексных узлов для суперпользователя. При неудаче возвращается nil.
-
("." ffree) → 2036930
-
(string favail) - количество свободных индексных узлов для обыкновенного пользователя. При неудаче возвращается nil.
-
("." favail) → 2036930
-
(string fsid) - идентификатор файловой системы. При неудаче возвращается nil.
-
("." fsid) → 1218234540
-
(string rdonly) - флаг только для чтения: true или false. При неудаче возвращается nil.
-
("." rdonly) → FALSE
-
(string nosuid) - возможность setuid/setgid отключена: true или false. При неудаче возвращается nil.
-
("." nosuid) → FALSE
-
(string namemax) - максимальная длина имени файла. При неудаче возвращается nil.
-
("." namemax) → 255
(string blkp) - является специальным файлом блочного устройства.
(string chrp) - является специальным файлом символьного устройства.
(string dirp) - является каталогом.
(string fifop) - является именованным или неименованным каналом.
(string lnkp) - является символической ссылкой.
(string regp) - является обычным файлом.
(string sockp) - является сокетом.
(string usrreadp)
(string setusrreadp flag)
(string usrwritep)
(string setusrwritep flag)
(string usrexecp)
(string setusrexecp flag)
(string grpreadp)
(string setgrpreadp flag)
(string grpwritep)
(string setgrpwritep flag)
(string grpexecp)
(string setgrpexecp flag)
(string othreadp)
(string setothreadp flag)
(string othwritep)
(string setothwritep flag)
(string othexecp)
(string setothexecp flag)
(string uidp) - право на изменение идентификатора пользователя при исполнении.
(string setuidp flag)
(string gidp) - право на изменение идентификатора группы при исполнении.
(string setgidp flag)
(string vtxp) - ограниченный режим удаления из каталога.
(string setvtxp flag)
(number-uid uname) - имя пользователя (login).
(number-uid gid) - числовой идентификатор группы по умолчанию.
(number-uid home) - строка, домашний каталог.
(number-uid shell) - командный интерпретатор по умолчанию.
(number-gid gname) - имя группы.
(number-gid gmem) - члены группы.
(nil getlogin) - строка, имя пользователя.
(nil getpid) - возвращает идентификатор процесса.
(nil getppid) - возвращает идентификатор родительского процесса.
(string-path chroot) - изменяет корневой каталог "/". Работает только от прав суперпользователя.
(number nice) - снижение приоритета. Возвращается новый приоритет или false. Меньший приоритет даёт больше прав.
Предметный указатель
&env
&rest
&whole
#\enter
#\escape
#\space
#\tab
!
+ list
+ number
+ string
+ symbol
+ vector
+= cons
+= number
+= string
+= vector
- number
- symbol
- vector
-= number
-= vector
* number
* vector
*= number
*= vector
/
/=
= char
= cons
= false
= nil
= number
= string
= symbol
= true
= vector
<> char
<> cons
<> false
<> nil
<> number
<> string
<> symbol
<> true
<> vector
< char
< number
< string
< symbol
<= char
<= number
<= string
<= symbol
> char
> number
> string
> symbol
>= char
>= number
>= string
>= symbol
%
^
'
`
,
,@
abs
accessf
accessr
accesstime
accessw
accessx
acons
alphap
and
apply
arch
arccos
arcsin
arctg
arg
arsh
arth
assoc
atom
backquote
bavail
bfree
bifp
blkp
blocks
blocksize
boundp
button-event
cbrt
ceil
cerr
ch
changetime
char char
char number
charp
chdir
chroot
chrp
cin
clear
close dir
close stream
close window
code
combin
combina
cond
cons nil
cons cons
consp
contain list
contain string
contain vector
controlp
copy char
copy dir
copy list
copy number
copy object
copy string
copy time
copy vector
copy-matrix
copy-tree
cos
count list
count string
count vector
count-if list
count-if string
count-if vector
cout
create
ctg
cth
day
daylightp
defclass
defmacro
defmethod
defvar
degrees
denom
device
digitp
dir
dirp
display-size
display-sizemm
do-while
draw-line
draw-pixel
draw-square
dstp
e
elt list
elt string
elt vector
empty
envp
eq
eval
evenp
exception
exception-history
exp
false
favail
ffree
fifop
files
find list
find string
find vector
find-if list
find-if string
find-if vector
finitep
first cons
first vector
floor
flush
for list
for number
for string
for vector
for* list
for* number
for* string
for* vector
fork
free
freeram
frsize
fsid
funcall
gcd
gensym
get
getclass
getcwd
getdebug
getegid
getenv
geteuid
getgid
getlogin
getmethod
getpid
getpixel
getppid
getstatic
getuid
gid number
gid string
gidp
gmem
gname
grpexecp
grpreadp
grpwritep
height
hide
history-show
home
hour
if
infp
inode
insert
integerp
keyb-event
last cons
last vector
lcm
let
letset
lg
link
links
list nil
list string
list vector
list*
listen stream
listen window
listp
ln
lnkp
load
localtime
lockp
log
lower char
lower string
lowerp
ls
machine
map cons
map vector
mapc cons
mapc vector
mapwindow
max char
max number
max string
max symbol
merge
min char
min number
min string
min symbol
minutes
mkdir
modifytime
month
move window
multinomial
namemax
namespace
nanp
newobject char
newobject cons
newobject dir
newobject lock
newobject number
newobject signal
newobject string
newobject symbols
newobject time
newobject vector
nice
nil
nodename
nosuid
not
nprocs
num
number number
number time
numberp
objectp
oddp
open dir
open string
open window
openp dir
openp stream
openp window
or
othexecp
othreadp
othwritep
package
pairlist
parallel
part string
part vector
pi
pointer-coord
pop vector
princ
print
printp
progn lock
progn nil
properties
push
put
quotep
radians
random
rassoc
rdevice
rdonly
read dir
read stream
read string
read-byte
read-char stream
read-char window
read-eval-print
read-keyb
read-line
readlink
regp
release
remove list
remove string
remove vector
remprop
rename string
rename window
replace list
replace string
replace vector
replace-if list
replace-if string
replace-if vector
resize string
resize vector
resize window
rest
reverse list
reverse vector
rewind
rmdir
round
roundint
save
second
seconds
seek
seekr
seekw
send
set lock
set symbol
setday
setdaylightp
setdebug
setegid
setelt list
setelt string
setelt vector
setenv
seteuid
setf char
setf cons
setf dir
setf number
setf string
setf time
setf vector
setfirst
setgid number
setgid string
setgidp
setgrpexecp
setgrpreadp
setgrpwritep
sethour
setlgid
setluid
setminutes
setmonth
setothexecp
setothreadp
setothwritep
setq
setrest
setseconds
setstatic
settime
settimezone
settzname
setuid number
setuid string
setuidp
setusrexecp
setusrreadp
setusrwritep
setvtxp
setyear
sh
shell
signalp
sin
size cons
size string
size vector
sockp
sort
spacep
sqrt
streamp
string
string number
string string
string time
stringp
substitute
swap
symbol
symbolp
symlink
sysname
system
tell
tellr
tellw
terpri
tg
th
third
this
throw
time nil
time time
timep
timezone
totalram
totalsize
transpose
true
truncate
try lock
try nil
tzname
uid
uidp
uname
unlink
unquote
unquote-splicing
unsetenv
upper char
upper string
upperp
uptime
usrexecp
usrreadp
usrwritep
vector cons
vector nil
vector string
vector vector
vectorp
version
vfsblocks
vfsblocksize
vtxp
wait
weekday
when
while
width
window
windowp
write
write-byte
writeln
xk-…
xor
year
yearday