Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 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. Ее использование позволяет "на ходу", в ходе выполнения программы, сформировать список-программу (содержащий вызовы функций) и исполнить его. В этом и заключается динамическая модификация текста программы, необходимая для решения задач искусственного интеллекта.

Математические и логические функции Автолиспа сведены в таблицу

 


Таблица - Основные математические функции Лиспа.

Имя функции Аргументы Возвращаемое значение
+ a1 a2... an a1+a2+...+an
- a1 a2... an a1-a2-...-an
* a1 a2... an a1a2...an
/ a1 a2... an a1/a2/.../an
1+ a a+1
1- a a-1
ABS a
SQRT a
EXP a
EXPT a b
GCD a b НОД чисел а, b
LOG a Ln(a)
MIN a1 a2... an Минимальное из чисел a1 a2... an
MAX a1 a2... an Максимальное из чисел a1 a2... an
REM a b Остаток от деления a/b
Тригонометрические функции
SIN a Sin(a), a - в радианах
COS a cos(a), a - в радианах _N_
ATAN a atn(a) в радианах

В языке также предусмотрена встроенная переменная PI, со значением, равным числу p.

Пример: Вычислить площадь треугольника S со сторонами a, b, c по формуле Герона:

Запишем программу вычислений:

(SETQ p (/ (+ a b c) 2))

(SETQ s (SQRT (* p (- p a) (- p b)

(- p c))))

Для того, чтобы эту программу выполнить, ее можно либо построчно набирать в ответ на приглашение Автокада "Команда:", либо записать в текстовый файл с расширением *.LSP и загрузить его. Функции будут выполнены в процессе загрузки файла.

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

Чтобы просмотреть значение переменной, надо в командной строке набрать восклицательный знак, а за ним - имя переменной:

Команда:

выведет на экран значение переменной а.

 

Date: 2015-12-12; view: 346; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.006 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию