Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Краткие теоретические сведения. Особенности организации памяти в Автолиспе приводят к тому, что следует ясно различать два понятия: переменная и значение переменной
Особенности организации памяти в Автолиспе приводят к тому, что следует ясно различать два понятия: переменная и значение переменной. Переменная - указатель на область динамической памяти, имеющий имя. Значение переменной - данные, записанные в динамической памяти начиная с адреса, записанного в переменной. Изменить можно как переменную, так и ее значение. В первом случае та же переменная будет указывать на другой участок динамической памяти, а во втором - в том же участке динамической памяти будет помещено новое значение. Для присваивания значений переменным в Автолиспе имеются две функции - SET и SETQ. Функция SETQ (set by q uote) меняет значение переменной, а не саму переменную. Аргументами функции является перечень пар "переменная" - "значение". Функция возвращает результат последнего присваивания. Например, запись (SETQ a 10) помещает число 10 в область памяти, на которую указывает переменная а и одновременно задает тип переменной а - целое число. Можно в одной функции присвоить несколько переменных: (SETQ a 10 b "213") Порядок выполнения нескольких присваиваний в функции SETQ определен слева направо. Если мы напишем: (SETQ a 10 b (+ a 10)), то значением переменной b станет 20. Изменение значения переменной на NIL освобождает занимаемую ее значением область памяти. (SETQ a NIL) сохраняет саму переменную а, но теперь она указывает "в никуда" (для ее значения памяти не выделено). SETQ - наиболее часто используемая функция присваивания. Она аналогична по своему действия оператору присваивания ":=" в Паскале и в принципе позволяет не задумываться об особенностях организации памяти в Автолиспе. Вторая функция присваивания - SET - работает не со значениями, а с самими переменными: (SET a b) заставляет переменную а ссылаться на ту же область памяти, что и переменная b. Как записать в значение переменной атом (число, текстовую строку...) понятно. А как быть, если в переменную нужно записать список? Например, имеется список с данными вида: (0.25 "АБВ" 46). Проблема заключается в том, что, как мы уже знаем, по умолчанию любой список считается программой и первый же элемент списка, стоящий сразу после открывающей скобки, рассматривается как имя функции. Если мы напишем функцию присваивания вида: (SETQ a (0.25 "АБВ" 46)) то интерпретатор попытается вызвать функцию с именем "0.25" и аргументами "АБВ" и "46", что приведет к возникновению ошибки "Неверное имя функции", поскольку функции с именем "0.25" нет и быть не может. Таким образом, необходимо как-то сказать Автолиспу: не пытайся выполнить этот список, это не программа, а данные. Для этого используется функция подавления вычисления списка QUOTE: Функция QUOTE запрещает вычисление списка, являющегося ее аргументом и возвращает сам этот список. В рассматриваемом примере нужно написать: (SETQ a (QUOTE (0.25 "АБВ" 46))) и в значением переменной астанет список (0.25 "АБВ" 46). Поскольку данные в программе встречаются весьма часто, введена сокращенная запись функции QUOTE в виде апострофа: (SETQ a '(0.25 "АБВ" 46)) Применять функцию QUOTE к атому бессмысленно: (QUOTE 0.25) и 0.25 - одно и то же. А что будет, если применить функцию QUOTE к переменной? Она вернет саму переменную, а не ее значение: (SETQ a 5) (SETQ b a) à значением переменной b будет 5 (SETQ b 'a) à значением переменной b будет переменная а. Поэтому функцию SET можно использовать и для изменения значения переменной: (SET 'a 10) делает то же, что и (SETQ a 10) поскольку запись 'aозначает значение переменной а. Итак, значением одной переменной может быть другая переменная! Такой прием используется редко, но знать о его существовании следует. Предположим теперь, что мы записали в значение переменной как данные список, который на самом деле является программой: (SETQ a '(+ 5 10)) Как теперь заставить Автолисп вычислить этот список? Для этого есть очень полезная функция EVAL (от evaluation): Функция EVAL вычисляет список, являющийся ее аргументом, и возвращает вычисленное значение. В нашем случае (EVAL a) вернет 15. Таким образом, функция EVAL обратна по отношению к функции QUOTE. Ее использование позволяет "на ходу", в ходе выполнения программы, сформировать список-программу (содержащий вызовы функций) и исполнить его. В этом и заключается динамическая модификация текста программы, необходимая для решения задач искусственного интеллекта. Математические и логические функции Автолиспа сведены в таблицу
Таблица - Основные математические функции Лиспа.
В языке также предусмотрена встроенная переменная PI, со значением, равным числу p. Пример: Вычислить площадь треугольника S со сторонами a, b, c по формуле Герона: Запишем программу вычислений: (SETQ p (/ (+ a b c) 2)) (SETQ s (SQRT (* p (- p a) (- p b) (- p c)))) Для того, чтобы эту программу выполнить, ее можно либо построчно набирать в ответ на приглашение Автокада "Команда:", либо записать в текстовый файл с расширением *.LSP и загрузить его. Функции будут выполнены в процессе загрузки файла. Внимание! Автокад не загружает автоматически файл с программой после того, как в него внесены изменения. Это надо делать принудительно при помощи меню или функции LOAD. В противном случае можно долго искать ошибку: программа исправлена, а работает, как и прежде. Чтобы просмотреть значение переменной, надо в командной строке набрать восклицательный знак, а за ним - имя переменной: Команда:!а выведет на экран значение переменной а.
|