Общие сведения о входном языке HomeLisp
Правила записи программ и отличия от стандарта Лисп

Алфавит HomeLisp включает латинские и русские буквы (заглавные и строчные), цифры и все спецзнаки, которые есть на стандартной клавиатуре. Имена атомов могут включать любые знаки (но числа должны начинаться с цифры и иметь "правильную" структуру). Так 1A - просто атом, 123 - число типа FIXED, 1e1 - число типа FLOAT (в научной нотации).

Заглавные и строчные буквы в именах атомов не различаются: CAR, car и Car - одно и то же. (А занятно звучит эта фраза!) Автор обращает особое внимание на то, что русские буквы могут входить в имена атомов (правда, это, на взгляд автора, порождает больше проблем, чем удобства: приходится часто переключать регистры; кроме того нечаянное употребление букв, совпадающих по начертанию, порождает крайне неприятные ошибки). В строках, заключенных в двойные кавычки, строчные и заглавные буквы различаются: "Car" и "CAR" - разные атомы.

Программы записываются в текстовых файлах в свободном формате. Комментарием является все содержимое строки после пар символов "//" или ";;".

Несколько слов о реализации языка. Разработчик придерживался стандарта Лиспа из книги Лаврова и Силагадзе (практически совпадающего с оригиналом великого Дж. МакКарти). Сделаны лишь некоторые дополнения (не затрагивающие основных концепций языка):

- всесто (QUOTE Нечто) можно писать 'Нечто ;
- вместо PLUS, DIFFERENCE, TIMES, QUOTIENT, REMAINDER можно писать "+ - * \ и %" соответственно;
- вместо LESSP, GREATERP , GREQP, EQ можно писать "< > >= и =" соответственно;
- для задания функции наряду с функцями SEXPR/SFEXPR можно использовать сокращенный вариант DEFUN/DEFUNF;
- добавлены функции типа MACRO, задаваемые с помощью функции SMACRO и сокращенный вариант этой функции DEFMACRO;

Также добавлено несколько встроенных функций, "парных" к описанным Лавровым и Силагадзе: (NEQ - "не равно" - парная к EQ; LEEQP - "меньше или равно" - парная к GREQP) и ряд других.

Несколько расширен список математических функций - добавлены тригонометрические функции, натуральный логарифм, экспонента, а также генератор псевдослучайных чисел;

Добавлен необходимый минимум строковых функций - извлечение и вставка подстроки, замена, получение ASCII-кода символа и символа по его ASCII-коду;

Добавлены функции простой графики, работы с файлами, работы с большими двоичными объектами (BLOBами), некоторые системные функции - словом, все то, чего не могло быть в далеком 1978-м , и что вполне естественно смотрится сейчас.

Типы данных и особенности арифметики

В HomeLisp имеются данные следующих типов: FIXED, FLOAT, BITS и STRING.

Данные типа FIXED - это целые числа практически неограниченной разрядности. Описываемые ниже функции PLUS, DIFFERENCE, TIMES, QUOTIENT, REMAINDER позволяют вычислить, например, величину "100 факториал" или "2 в сотой степени".

Данные типа FLOAT соответствуют числам с плавающей точкой двойной точности (DOUBLE). Для работы с данными типа FLOAT можно использовать функции PLUS, DIFFERENCE, TIMES, ADD1, SUB1. Для деления чисел типа FLOAT следует использовать функцию DIVIDE (отсутствующую в реализации Лаврова и Силагадзе). Попытка использовать для деления чисел с плавающей точкой функции QUOTIENT и REMAINDER приведет к ошибке.

Данные типа BITS представляют собой 32-х битовые шкалы. Над ними можно выполнять битовые поразрядные операции LOGAND, LOGOR, LOGXOR, а также сдвигать в обе стороны, используюя функцию с двумя аргументами LEFTSHIFT. Второй аргумент задает количество сдвигов (число типа FIXED). Если оно отрицательно - сдвиг выполняется вправо.

Арифметика HomeLisp частично полиморфна. У функций PLUS, DIFFERENCE, TIMES допустимы аргументы типов FIXED и/или FLOAT. При вычислении происходит "поглощение" типом FLOAT типа FIXED. Так, при вычислении выражения:

(+ 555 1.0)


будет получен результат 556.0, имеющий тип FLOAT. Тогда, как при вычислении выражения:

(+ 555 1)


будет получен результат 556, имеющий тип FIXED.

Функция EXPT (возведение в степень) возвращает результат типа FIXED только если оба ее аргумента имеют тип FIXED. В противном случае возвращается результат типа FLOAT. Дополнительно следует отметить, что попытка возведения отрицательного числа (любого типа) в вещественную степень (даже с нулевой дробной частью) вызовет ошибку. Тогда как возведение отрицательного числа в целую степень выполняется без проблем. Нуль в любой положительной степени равен нулю. Попытка возвести нуль в отрицательную степень вызовет ошибку. Возведение числа в нулевую степень дает единицу.

Функции инкремента и декремента ADD1, SUB1 возвращают результат того же типа, что и аргумент.

Имеется еще один встроенный тип данных большие двоичные объекты - BLOB-ы. Каждый такой объект представляет собой двоичный буфер в оперативной памяти. Этот буфер можно заполнять программно или загружать двоичными данными из файлов. Имеется развитый набор манипулирования BLOB-ами и их содержимым. Более подробно действия с BLOB-ами описаны в соответствующем разделе документации.