Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 400242.doc
Скачиваний:
10
Добавлен:
30.04.2022
Размер:
14.24 Mб
Скачать

4.2. Язык Лисп

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

Название языка официально означает LISt Processing, а неофициально - Lots of Idiotic Silly Parentheses. Лисп отличается высокой компактностью - ядро интерпретатора занимает 4..10Кб, функциональным стилем программирования и использованием обратной польской нотации.

Основное понятие языка Лисп - список.

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

Как видно из определения, списки могут быть вложенными. А что же такое атом в Лиспе? Это простой (в отличие от списка) тип данных: число, символьная строка, функция.

Внимание: в Лиспе нет различия между текстом программы и обрабатываемыми ею данными!

В других языках (например, в Паскале) программа (PROCEDURE, FUNCTION) и данные (VAR, CONST) жестко разделены. В Лиспе же и данные, и текст программы являются списками. Разумеется, список, являющийся программой, включает в себя атомы-функции, которые и вызываются при выполнении программы. То, что с программой можно работать, как с данными, и определяет возможность динамической модификации текста программы, что является свойством языков искусственного интеллекта. Как же отличить список-программу от списка-данных?

В Лиспе по умолчанию любой список является программой и интерпретатор будет пытаться ее выполнить. Если список - не программа, а данные, надо явно отключить его интерпретацию.

Из того, что текст программы - тоже список, вытекает необходимость использования специальной системы его записи - обратной польской нотации (названа так по причине изобретения ее польским математиком Яном Лукасевичем). Вызов любой функции в данной нотации записывается как список следующего вида:

(1.2)

где - аргументы функции.

Например, если функция сложения двух чисел имеет имя "+", то операция 2+3 запишется как ( + 2 3 ). В качестве аргументов могут фигурировать другие функции, что позволяет записывать сколь угодно сложные формулы в обратной польской нотации.

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

( * ( / ( + ( * 2 x ) 3 ) ( - y 1 ) ) ( - y x ) ).

Теперь рассмотрим конкретную реализацию языка Лисп - встроенный в САПР AutoCAD интерпретатор языка AutoLISP (Автолисп). Выбор столь экзотического языка в качестве встроенного для столь популярной САПР вызван тем, что список - оптимальный способ представления графической информации, а также легкостью реализации и небольшими размерами интерпретатора. Однако следует признать относительно большую трудоемкость разработки программ на Автолиспе. Зато программы на Автолиспе отличаются чрезвычайно высокой надежностью; за многие годы работы ошибок в работе интерпретатора не выявлено.

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

Каждый атом имеет имя, дающееся по следующим правилам - допускаются английские буквы, цифры, большинство имеющихся на клавиатуре знаков за исключением ";", "(", ")", ".", "," ," ", строчные и заглавные буквы не различаются, первым символом должна быть буква.

Буква T зарезервирована и не должна использоваться в качестве имени атома. Слово NIL зарезервировано и не должно использоваться в качестве имени атома. Использование в качестве имени атома имени встроенной функции приведет к потере работоспособности этой функции до перезагрузки AutoCADа.

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

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

Автолисп поддерживает следующие типы данных:

  • целое число со знаком от -32768 до 32767 или от 0 до 65535 (2 байта) без знака;

  • вещественное число, записываемое через десятичную точку: 10.52 или в экспоненциальном формате: 2.52Е-12;

  • строка символов длиной до 127 знаков, заключенная в двойные кавычки. Символ "\" является служебным и, если он нужен в тексте, должен удваиваться: текст "3\2" запишется как "3\\2". "\" используется для обозначения перевода строки: "\n", возврата каретки: "\r" и табуляции: "\t";

  • логический тип, принимающий два возможных значения: истина (обозначатся Т) или ложь.(обозначается NIL);

  • ссылка на встроенную функцию языка;

  • ссылка на созданный программистом список (программу или данные);

  • ссылка на переменную;

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

Объекты. В AutoLISP имеются два общих типа объектов - АТОМЫ и СПИСКИ. Атомы - простые объекты; списки - сложные объекты. Атомы и списки взаимно исключающие. Что-нибудь что является атомом не может быть список, и наоборот.

СПИСКИ

Списки - сложные объекты, упоминаемые в некоторых описаниях как символические выражения, или " s-выражения ". Списки сформированы вне атомов и ( или ) других списков. Список синтаксически прост; он должен ограничиваться согласованными круглыми скобками, и объекты внутри списка должны отделяться от друга друга пробелом.

Примеры списков:

( + 1 3 ) ; Сложить 1 и 3

( - 9 5 ) ; Вычесть 5 из 9

( + 1 ( + 2 3 )) ; Добавить 1 к результату сложения 2 и 3

Что-нибудь ограниченное согласованными круглыми скобками должно быть списком; что-нибудь не ограниченное согласованными круглыми скобками должно быть атомом.

Индивидуальные члены списка известны как элементы. Элементы списков могут быть или атомами или другими списками.

В AutoLISP имеется один объект, который является и атомом и списком. Это - пустой список; то есть список не имеющий никаких элементов, обычно называемый НУЛЬ (NIL).

( ) или нуль

Нуль ( пустой список ) в AutoLISP не "никакое значение". Когда объект в AutoLISP не имеет никакого значение, тогда значение объекта - нуль.

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

  1. Список;

  2. Символы;

  3. Строки;

  4. Вещественные числа;

  5. Целые числа;

  6. Описатели файла;

  7. "Имена" примитивов AutoCAD;

  8. Наборы выбор AutoCAD;

  9. встроенные функции.

Для определения типа данных любого объекта может быть использована функция языка AutoLISP (type), которая берет один требуемый параметр, и возвращает символ, который указывает тип данных параметра.

Например, определить тип данных целого числа 1.

Команда: ( type 1 )

INT

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]