[an error occurred while processing this directive]

TIMES Subr

(TIMES число число ...)

TIMES принимает значение результатов всех аргументов. Все аргументы должны быть числами и оценка их результата не должна привести к переполнению. Функция может содержать до 28 аргументов. Например:

(TIMES 28 4 -2) = -224

См. также PLUS, DIFFERENCE, QUOTIENT и REMAINDER.

UNDEFINED специальный идентификатор

UNDEFINED = UNDEFINED

При создании новых идентификаторов функциями READ, GETCHAR, CHARACTER, READLINE или IMPLODE им присваивается значение UNDEFINED (неопределенный). Атомы, которые не имеют ни значения UNDEFINED, ни характеристик, являются специальными; они не встречаются в списке идентификаторов, полученном функцией OBLIST, и могут быть уничтожены коллектором 'мусора', если к ним не относятся никакие структуры. Чтобы удалить идентификатор, используйте (SETQ UNWANTED-ATOM UNDEFINED) после использования REMPROP, чтобы удалить все характеристики из ненужного атома.

UNTIL Fsubr

(UNTIL условие значение...)

UNTIL используется с функцией LOOP. Анализируется условие, и если это ноль, то функция UNTIL ведет себя как обычная функция и принимает значение ноль. Если не ноль, то происходит следующее:

(а) Значения, указанные после условия, обрабатываются один за другим, а последнее становится значением функции UNTIL. Если значений нет, то возвращается значение предиката.

(б) Для завершения цикла (LOOP) по UNTIL устанавливается флаг. Цикл не заканчиватся пока он не будет готов обработать следующий аргумент верхнего уровня. См. пример для функции LOOP.

USR Subr

(USR адрес a x y p)

USR вызывает функцию машинного кода, расположенную по указанному адресу, при этом машинные регистры получают значения, определенные числовыми аргументами a, x, y и p. Результатом функции будет список. Элементами списка (их должно быть всегда точно 4) будут числа в интервале от 0 до 255, отражающие состояние регистров процессора после возвращения из подпрограммы. USR - это обобщенная форма CALL, и ее можно использовать для того, чтобы осуществить доступ к операционным средствам ПЭВМ АГАТ.

VDU Subr

(VDU число число ...)

Все аргументы функции должны быть числовыми, и передаваться функцией VDU последовательно контроллеру экрана микрокомпьютера. Если числа расположены в интервале от 0 до 31, они имеют особое назначение; например, определение новых нецветных символов, изменение цветов экрана, а также построение точек, линий и треугольников. Числа в интервале от 32 до 127 относятся к печатаемым символам, в соответствии с теми же кодами, которые используют функции CHARACTER и ORDINAL. За дальнейшими подробностями о допустимых контрольных кодах обращайтесь к Руководству пользователя. Предполагается, что в следующих примерах задан графический режим LISP, например режим 4:

(VDU 12)           очистить экран
(VDU 22 4)         изменить режима экрана на режим 4
(VDU 19 1 3 0 0 0) изменить значение цвета 1

Если при использовании функции VDU для изменения режима экрана новый режим требует больше памяти, чем было отведено LISP, может произойти наложение. См. MODE.

WHILE Fsubr

(WHILE условие значение ...)

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

WRITE Subr

(WRITE указатель аргумент1 аргумент2...)

WRITE аналогична PRINT, за исключением того, что вывод осуществляется в файл, указтель которого определяется первым аргументом. См. OPEN и CLOSE.

WRITEO Subr

(WRITEO ручка аргумент1 аргумент2 ...)

WRITEO аналогична PRIN, и вывод осуществляется в файл, определенный первым аргументом.

XTAB Expr

(XTAB число)

Печатает определенное количество пробелов в начале новой строки. XTAB используется функцией SPRINT и определяется следующим образом:

(DEFUN XTAB (N)
   (PRINT)
   (LOOP
      (UNTIL (MINUSP (SETQ N (SUB1 N))))
      (PRINC BLANK)))

ZEROP Subr

(ZEROP число)

ZEROP принимает значение Т, если аргумент - число 0. В противном случае она принимает значение 0. (ZEROP x) точно соответствует (EQ x 0). См. ONEP.

* Subr

(* команда операционной системы)

Функция '*' вызывает любую команду микрокомпьютера. Ее аргументом является идентификатор, имя которого используется для определения команды. Если запрашиваемая операция портить память, используемую LISP, то LISP не может продолжить операцию после выполнения *. Например:

(* 'BASIC)      выход из LISP, выбор BASIC в качестве следующего
                используемого языка.
(* 'CAT)        Просмотр директории файла.
(* 'EXEC! FILE) Чтение содержимого файла FILE, как если бы
                символы вводились с клавиатуры.

! специальный символ

!(,!!,!),!.

Символ ! (восклицательный знак) используется для разрешения ввода идентификаторов, имена которых содержат знаки препинания. Восклицательному знаку может предшествовать любой необычный символ, и пользователь включает его в имя, как если бы это была буква. Таким образом, если это скобки, напишите !( и !) (или LPAR и RPAR). !! означает один восклицательный знак.

ПРИЛОЖЕНИЕ В

Некоторые невстроенные в LISP полезные функции

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

APPEND

Если x и y - два списка, (APPEND x y) - список, полученный при размещении всех элементов списка y после всех элементов списка х. Таким образом, (APPEND '(p q)'(r s)) - это список (p q r s).

(DEFUN APPEND (A B) (COND
   ((NULL A) B)
   (T (CONS (CAR A) (APPEND (CDR A) B)))))

CONCAT

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

(DEFUN CONCAT (A B)
   (IMPLODE (APPEND (EXPLODE A) (EXPLODE B))))

DELETE

Первым аргументом может быть любой элемент списка, который (список) является вторым аргументом.Результатом будет список с удаленным первым элементом.

(DEFUN DELETE (A L) (COND
   ((NULL L) NIL)
   ((EQUAL A (CAR L)) (CDR L))
   (T (CONS (CAR L) (DELETE A (CDR L))))))

DIGIT

DIGIT проверяет является ли ее аргумент цифрой. Если да, то результат - соответствующее десятичное число; в противном случае, результат - 0.

(DEFUN DIGIT (CH)
   (SETQ CH (ORDINAL CH))
   (COND
      ((OR (LESSP CH 48)
           (GREATER CH 57)) NIL)
      (T (DIFFERENCE CH 48))))

Эта программа использует существующее кодовое соответствие для символов: '0', '1', ...'9' соответственно 48, 49, ...57.

EQUAL

Основная функция LISP EQ сравнивает два атома на их равенство. Если речь идет о списковых структурах, то сравниваются их указатели. EQUAL сравнивает списковые структуры; являются ли они структурами одного вида с одинаковыми атомами.

(DEFUN EQUAL (A B) (COND
   ((EQ A B) T)
   ((OR (ATOM A) (ATOM B)) NIL)
   ((EQUAL (CAR A) (CAR B)) (EQUAL (CDR A) (CDR B)))
   (T NIL)))

FLATTEN

FLATTEN обрабатывает общую списковую структуру и возвращает список одного уровня со всеми найденными в нем атомами.

(DEFUN FLATTEN (A (L)) (COND
   ((GULL A) L)
   ((ATOM A) (CONS A L))
   (T (FLATTEN (CAR A) (FLATTEN (CDR A) L)))))

LAST

(LAST x) возвращает последний элемент в списке х.

(DEFUN LAST (L) (COND
   ((NULL (CDR L)) (CAR L))
   (T (LAST (CDR L)))))

MEMBER

Эта функция проверяет является ли первый аргумент одним из элементов списка, где список - второй аргумент. Функция использует EQUAL для проверки на равенство.

(DEFUN MEMBER (A L) (COND
   ((NULL L) NIL)
   ((EQUAL A (CAR L)) T)
   (T (MEMBER A (CDR L)))))

NUMOB

В функции NUMOB, как и в IMPLODE аргументом является список символов. В функции NUMOB все символы - цифры, а значение функции - число, которое является последовательностью цифр, отражающих десятичное представление этого числа:

(DEFUN NUMOB (L (N . O))
   (LOOP
      (WHILE L N)
      (SETQ N (PLUS (TIMES N 10)
                    (DIFFERENCE (ORDINAL (CAR L))
                                48)))
      (SETQ L (CDR L))))

RDF

(RDF имя файла) считывает и вычисляет все выражения, содержащиеся в данном файле, и останавливает работу когда происходит ошибка.

(DEFUN RDF (NAME (HANDLE))
   (SETQ HANDLE (OPEN NAME T))
   (LOOP
   (UNTIL (ATOM (ERRORSET (EVAL (READ HANDLE))))))
   (CLOSE HANDLE))

REVERSE

(REVERSE '(A B C D)) имеет значение (D C B A). Для любого списка х (CAR (REVERSE x)) = (LAST x).

(DEFUN REVERSE (X (W))
   (LOOP
      (WHILE X W)
      (SETQ W (CONS (CAR X) W))
      (SETQ X (CDR X))))

SUBST

(SUBST a b c) заменяет а на b в выражении с.

   (T (CONS (SUBST A B (CAR C))
            (SUBST A B (CDR C))))))

TRACE

После вызова функции (TRACE fname), при каждом обращении к функции fname выдается сообщение, в котором перечислены все ее аргументы и ее результат. Это очень полезно при возможном неправильном поведении функции, однако предусмотреть это программно довольно трудно. UNTRACE восстанавливает функцию до перврначального вида:

(DEFUN TRACE FN
   (SETQ FN (CAR FN))
   (PUT FN 'OLDDEF (EVAL FN))
   (SET FN (SUBST FN 'FN
      '(LAMBDA *X
          (SETQ *X ((MAPC EVAL *X))
          (PRINTC 'FN BLANK *X))
          (SETQ *X (APPLY (GET 'FN 'OLDDEF) *X))
          (PRINT 'FN '= *X)
          *X)))
   FN)

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

UNTRACE

UNTRACE - функция обратная функции TRACE и вызывается аналогичным образом.

(DEFUN UNTRACE FN
   (SETQ FN (CAR FN))
   (SET FN (GET FN 'OLDDEF))

   (REMPROP FN 'OLDDEF)

ПРИМЕЧАНИЕ

Функции, работающие со звуком, часами и календарем доступны только при использовании системы "СПРУТ".

ПРИЛОЖЕНИЕ С

Коды ошибок

Этот отрывок отражает коды ошибок и ситуации их возникновения.

0, 1, 2 - Недостаточно памяти
-----------------------------
   0   Нет места для стека
   1   Нет места для связи переменных
   2   Нет места для новой ячейки

Все эти три ошибки означают, что LISP заполнил всю доступную рабочую память, вызвал коллектор ненужных данных, однако не может восстановить достаточное для дальнейших вычислений количество памяти. Такая ситуация может возникнуть по ряду причин:

(а) Программа занимает памяти больше, чем доступно для пользования.

(б) Программа зациклена, и требует много памяти.

(в) Рабочая память занята большой структурой данных или предыдущей программой.

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

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

(б) Удалить все ненужные объявления функций, переменных и характеристик, установив идентификатор UNDEFINED и вызвав функцию REMPROP.

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

(г) Уменшить структуру данных, используемую в программе, путем записи ее в более сжатом виде.

3 - Недостаточно аргументов для функций Fsubr

---------------------------------------------

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

4 - Прерывания, возникающие при вычислениях

--------------------------------------------

Эта ошибка возникает при нажатии клавиши РЕД во время работы LISP. Трассировка показывает что произошло в это время.

5 - Выражение, расположенное на месте функции, не является функцией.

-------------------------------------------------------------------

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

Первый аргумент показывает при трассировке состояние LISP по обработке функции на момент ошибки : это будет UNDEFINED для неопределенной функции. Второй аргумент показывает обрабатываемый список, и первый элемент его будет недопустимая функция.

6 - Неправильное количество аргументов для функций Expr и Subr

--------------------------------------------------------------

Эта ошибка возникает в ряде случаев:

(а) Была сделана попытка вызвать функцию, у которой аргументов больше 28.

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

(в) Была вызвана функция, определенная в LISP, с недостаточным количеством параметров в ее переменном списке.

Второй аргумент при обратной трассировке показывает выражение с ошибкой.

7 - Синтаксическая ошибка в выражении - lambda

----------------------------------------------

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

8,9 - Синтаксическая ошибка в функции READ

------------------------------------------

Эта ошибка обнаруживается при чтениии функцией READ, если первый символ - точка или правая скобка, или при возникновении ошибки в формате выражения, которое содержит внутри точки, например:

(THIS . WILL . FAIL TO READ IN)

Если ввод осуществлялся с клавиатуры, на экране все равно будет сообщение.

10 - Слишком большое слово

--------------------------

LISP может оперировать идентификаторами длиной до 249 символов, и эта ошибка выдается, если сделана попытка превысить этот предел.

11 - Прерывание при печати

--------------------------

Эта ошибка аналогична ошибке 4, но ошибка возникла не при выполнении вычислений, а при нажатии клавиши РЕД при печати. Т.к. это часто используется при печати для выхода из больших нежелательных выражений, эта ошибка блокирует обратную трассировку.

12 - Внутренний сбой в функции PRINT

------------------------------------

Произошел сбой системы LISP (например при использовании функции POKE). Эта ошибка может произойти при изменении значений специальных переменных таких, как ноль и Т.

13 - Синтаксическая ошибка в выражении COND

-------------------------------------------

Эта ошибка является ошибкой программирования - выражение COND записано неверно. Эта ошибка связана с появлением атома на месте списка условие/действие. Первый аргумент при обратной трассировке показывает обнаруженный атом, а второй - законченное неверное выражение COND.

14 - Попытка получить CAR или CDR атома

---------------------------------------

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

15 - Ошибка вызванная обращением к функции ERROR

------------------------------------------------

Функция ERROR генерирует эту ошибку после печати аргумента.

16 - Неправильный аргумент функций SET или SETQ

-----------------------------------------------

Первый аргумент SET должен обрабатывать идентификатор, а первый аргумент функции SETQ должен быть идентификатором. При обнаружении ошибки 16 в функции SET, эта ошибка является логической при выполнении функций. А в функции SETQ она обычно отражает ошибку в программировании, например, (SETQ 3 12).

17 - Должен быть идентификатор

------------------------------

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

18 - Арифметическое переполнение

--------------------------------

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

19 - Первый аргумент RPLACA или RPLACD не является списком

----------------------------------------------------------

Первым аргументом RPLACA и RPLACD должен быть список или пара точек. Эта ошибка аналогична ошибке 14 (недопустимый аргумент CAR или CDR).

20 - Испорчен список характеристик

----------------------------------

Неправильное применение функций RPLACA или RPLACD к значениям, полученным функцией PLIST может привести к спискам характеристик с нестандартными структурами. Эта ошибка происходит, если доступ к спискам характеристик осуществляется с помощью обычных функций доступа.

21 - Требуется числовое значение

--------------------------------

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

22 - Первый аргумент APPLY не является функцией

-----------------------------------------------

Первым аргументом APPLY должен быть список, начинающийся со слова LAMBDA, или указатель кода (Subr атом). В противном случае, происходит ошибка. Таким образом, выражение (APPLY CAR '((A))) является правильным, а (APPLY 'CAR '((A))) вызывает ошибку 22.

23 - Неправильный список аргументов функции APPLY

-------------------------------------------------

Вторым аргументом APPLY должен быть список. Если это не так, происходит ошибка, т.е. если второй аргумент - какой-нибудь, отличный от нулевого, атом.

24 - Неправильный аргумент функции MAPC

---------------------------------------

Обычно вызывается, если второй аргумент MAPC - неправильный список, например, необъявленный (UNSET) или ненулевой атом.

25 - Слишком большая строка для функции IMPLODE

-----------------------------------------------

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

26 - Ошибка файловой системы

----------------------------

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

27 - Файл не найден

-------------------

Была сделана попытка обратиться к файлу, который не был открыт.

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

.цв

С Л О В А Р Ь Т Е Р М И Н О В

.ов

Краткий словарь технических терминов

Acces function - функция доступа

Функция, которая осуществляет выбор компонента из структуры данных. Существует главным образом, чтобы отделить логическую цель структуры данных от ее реализации.

Algorithm - алгоритм

Системный процесс решения проблем.

Argument - аргумент

Значение, которое передается функции при обращении к ней.

Assembler - ассемблер

Программа перевода мнемоники машинных команд в двоичное представление, используемое в машине.

Atom - атом

Объект языка LISP, который не является списком. Слово или число.

Backtrace - обратная трассировка

Информация, которая показывает какие функции проходили обработку в момент обнаружения ошибки.

Binary operator - бинарный оператор

Символ '+' или '*', который соединяет два выражения.

Bottom-up - снизу вверх

Стиль программирования, при котором сначала разрабатываются более простые средства, которые можно сразу реализовать на языке программирования, и которые упрощают дальнейшую работу. См. Top-down.

Breadth first - поиск в ширину

Метод поиска, который сравнивает все альтернативы более или менее параллельно.

Carriage return - возврат каретки

Клавиша RETURN на клавиатуре. Результат нажатия клавиши.

Carry - перенос

Удерживает цифру переноса в результате арифметической операции в интервале (0,9), корректируя следующий значащий разряд.

Chain down - вниз по цепочке

Поэлементный поиск в списке.

Concatenating - связь, соединение

Соединение конца с концом.

Conditional expression - условное выражение

Структура, которая проверяет условие и выдает один результат из числа возможных.

Co-routines - сопрограммы

Функции, которые работают вместе без подчинения друг другу.

Cyclic structure - циклическая структура

Списковая структура, в которой некоторые указатели встречаются в замкнутых циклах.

Database - база данных

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

Debugging - отладка

Нахождение и устранение ошибок в программе.

Dotted pairs - пары точек

Структуры данных LISP, записанные в виде (x . y), где x и y - подструктуры.

Econet

Локальная сеть компьтера Acornsoft

Editor - редактор

Программа, позволяющая изменять тексты существующих программ.

EOF - конец файла

Аббревиатура от 'End of File'.

Expression - выражение

Аналитическое выражение, которое предстоит вычислить.

Factorial - факториал

Произведение первых нескольких целых чисел. Например, факториал 6 равен 1 х 2 х 3 х 4 х 5 х 6 = 720

File handle - указатель файла

Значение, которое принимает функция OPEN при обращении к файлу.

Formal arguments - формальные аргументы

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

Forwarding address - адрес перехода

Указание какого-либо перехода.

Function call - обращение к функции

Вызов функции.

Global exchanges - глобальные изменения

Систематическая замена одного символа другим в тексте или структуре данных.

Identifier - идентификатор

Слово или символ.

Ink blot - "чернильное пятно"

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

Interactive - интерактивный

Метод программрования, при котором чередуются запросы пользователя и ответы компьютера во время выполнения вычилений.

Keyboard input buffer - буфер ввода с клавиатуры

Место, где компьютер запоминает символы, которые набрал пользователь, но не использовала еще программа.

Leaves - листья

Элементы самого нижнего уровня в древовидной структуре данных.

List - список

Последовательность элементов. Структура данных, которая вполне может представлять такую последовательность.

Local variables - локальные переменные

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

Multi-tasking - мультизадачный режим работы

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

Operand - операнд

Значение, используемое оператором.

Parser - синтаксический анализатор

Программа, которая преобразует последовательность слов в структуру данных, отражающую признак объединения.

Predicate - предикат

Функция, которая выдает булевое значение (т.е. 'истина' или 'ложь').

Prettyprinter - программа красивой печати

Программа, которая оформляет другие программы с целью облегчить их чтение.

Primitives - примитивы

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

Priority queue - приоритетная очередь

Очередь, организованная таким образом, что первый элемент очереди определяется по какому-то признаку приоритета, не обращая внимания на порядок, в котором элементы образуют очередь.

Property - свойство, характеристика

Информация, связанная с объектом.

Recursion - рекурсия

Функция, вызывающая сама себя.

ROM - ПЗУ

Аббревиатура от 'Read Only Memory'

S-expression - S-выражение, точечное выражение ЛИСП

Общая структура данных ЛИСП.

Scope - область действия

Область программы, где можно использовать данную переменную.

Structure editing - структурное редактирование

Изменение программы ЛИСП, используя ее представление в виде данных.

Stub - остаток тела (подпрограммы или модуля)

Фрагмент программы - структуррный нуль.

Syntax - синтаксис

Правила построения программы, в понятном для машины виде.

Top-down - сверху вниз

Способ программирования, при котором задания высокого уровня подразделяются на более маленькие (однако более поддающиеся организации) подзадания.

Trace - трассировка

Отражение части выполняемой программы.

Tree - дерево

Структура данных ЛИСП, при которой каждая часть относится к двум несвязанным поддеревьям.

Tube

Схема подсоединения других компьютеров к микрокомпьютерам ВВC.

.сс

[an error occurred while processing this directive]