Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
A ; два перевода строки (terpri и print)↑ ⇐ ПредыдущаяСтр 14 из 14 Содержание книги
Поиск на нашем сайте
B C C; значение Функцию PRINT можно определить с помощью TERPRI, PRIN1 и PRINC следующим образом:
_(defun print1 (x) (prog2 (terpri) (prin1 x) (princ “ ”)) PRINT1 FORMAT выводит в соответствии с образцом Печать выражений в сложной форме с помощью функций PRINx и TERPRI требует либо предварительного построения специальных структур, либо требует последовательного использования большого числа функций вывода. Программирование, таким образом, усложняется, и поэтому не сразу можно понять, что же на самом деле печатается. Для решения этих проблем в Коммон Лиспе есть функция FORMAT, при помощи которой можно, используя параметры, гибко задать формат печати. О множестве возможностей и, с другой стороны, о сложности функции FORMAT свидетельствует то, что в спецификации Коммон Лиспа ей посвящено несколько десятков страниц. Мы рассмотрим лишь самые существенные с точки зрения практического программирования форматы вывода. Форма вызова функции FORMAT следующая:
(FORMAT поток образец &REST аргументы)
Первый аргумент формы поток задает файл или устройство, куда осуществляется вывод. Потоку присваивается значение Т, если вывод осуществляется на экран. При выводе в файл потоком является поток вывода, представляющий этот файл. Вторым аргументом образец является ограниченная с обеих сторон кавычками управляющая строка, которая может содержать управляющие коды. Они опознаются по знаку ~ (тильда) перед ними. Остальные аргументы формы ставятся в соответствие управляющим кодам строки. Если управляющие коды и соответствующие им аргументы не используются, то FORMAT выводит строку так же, как функция PRINC, и возвращает в качестве значения NIL.
_(format t “Это печатается!”) Это печатается! NIL; значение Задав NIL значением параметра ПОТОК, получим в качестве результата функции строку, построенную с помощью управляющих кодов и аргументов. У такой формы есть лишь значение, и нет побочного эффекта, связанного с выводом. Гибкость функции FORMAT основана на использовании управляющих кодов. Они выводят в порядке их появления слева направо каждый очередной отформатированный аргумент или осуществляют какие-нибудь действия, связанные с выводом. Наиболее важными управляющими кодами и их назначением являются:
КОД НАЗНАЧЕНИЕ ~% Переводит строку ~S Выводит функцией PRIN1 значение очередного аргумента ~A Выводит функцией PRINC значение очередного Аргумента ~nT Начинает вывод с колонки n. Если уже ее достигли, То выводится пробел ~~ Выводит сам знак тильды. Приведем пример:
_(format t “На~%отдельные~%строки~%”) На; печать Отдельные; печать Строки; печать NIL; результат _(format nil “Ответ - ~S” (+ 2 3)); печати нет “Ответ - 5”; значением является строка _(setq x 2) _(setq y 3) _(format t “~S плюс ~S будет ~S~%” x y (+ x y)) Плюс 3 будет 5 NIL _(format t “Знак тильды: ~~”) Знак тильды: ~ NIL _(defun таблица (а-список) (format t “~%Свойство~15Tзначение~%”) (do ((пары а-список (rest пары))) ((null пары) (terpri)) (format t “~%~A~15T~A” (caar пары) (cadarпары)))) ТАБЛИЦА _(таблица ’((имя “Zippy”) (кличка “Pinhead”) (язык английский))) Свойство Значение ИМЯ Zippy КЛИЧКА Pinhead ЯЗЫК АНГЛИЙСКИЙ Различные Лисп-системы дополнительно к основным функциям ввода и вывода содержат целый набор различных встроенных функций, макросов и других средств, при помощи которых можно задавать более сложные виды печати, например шрифт. Отдельный мир образуют интеллектуальные и программируемые растровые дисплеи Лисп-машин и более развитых рабочих мест с битовыми картами и средствами указания (мышь, сенсорно-чувствительный дисплей и другие). Они позволяют при вводе и выводе использовать окна и графические образы (icons). Наличие таких средств зависит от возможностей системных и внешних устройств и варьируется от системы к системе.
Использование файлов Ввод и вывод во время работы с Лиспом в основном осуществляется через дисплей и клавиатуру. Файлы используются, как правило, лишь для хранения программ в промежутке между сеансами. Однако иногда возникает необходимость работы с файлами из программы. Основные средства работы с файлами нужно знать еще и потому, что во многих системах дисплей и каждое окно в системах с окнами считаются файлами. В Коммон Лиспе ввод и вывод осуществляются независимо от конфигурации внешних устройств через потоки. Потоки представляют собой специальные резервуары данных, из которых можно читать (поток ввода) или в которые можно писать (поток вывода) знаки или двоичные данные. У системы есть несколько стандартных потоков, которые являются значениями глобальных переменных. Наиболее важные из них
*STANDARD-INPUT* *STANDARD-OUTPUT* Эти системные переменные определяют для функций ввода (READ и др.) и соответственно для функций вывода (PRINx, TERPRI и др.) файлы по умолчанию, которыми в начале сеанса являются дисплей или терминал пользователя. В этом случае нет необходимости в начальном объявлении потока ввода для функции READ или потока вывода для функций вывода (исключением является функция FORMAT). Если мы хотим обмениваться данными с каким-нибудь новым файлом, то сначала его нужно открыть (open) в зависимости от его использования для чтения или для записи. У директивы OPEN может быть много ключевых параметров. Самым важным из них является:DIRECTION:
(OPEN файл &KEY:DIRECTION) Значением параметра могут быть следующие ключи:
ПАРАМЕТР ЗНАЧЕНИЕ :INPUT Открыть поток для ввода :OUTPUT Открыть поток для вывода :IO Открыть двусторонний поток Ключи в вызове функции не требуют апострофа. Например, следующий вызов открывает поток для вывода файла ПРОБА.LSP:
_(open ’проба.lsp:direction:output) ... Потоковый объект, получаемый в результате вызова OPEN, можно для следующего использования присвоить какой-нибудь переменной:
_(setq поток (open ’проба.lsp:direction:io)) ... Этот вызов присваивает переменной ПОТОК двусторонний поток, связанный с файлом ПРОБА.LSP. Поток можно при помощи присваивания сделать и системным потоком по умолчанию:
_(setq *standard-input* поток) ... После этого действие функции READ было бы перенаправлено на файл ПРОБА.LSP, а не на пользовательское устройство ввода. Наряду с файлами по умолчанию, другим способом задать источник для ввода или получатель для вывода является передача желаемого потока в качестве параметра вызова. Для функций READ, PRINx и TERPRI это осуществляется через необязательный параметр. Более подробным описанием параметров этих функций будет:
(READ x &OPTIONAL поток) (PRINT x &OPTIONAL поток) (PRIN1 x &OPTIONAL поток) (PRINC x &OPTIONAL поток) (TERPRI x &OPTIONAL поток) Таким образом, все ранее рассмотренные функции ввода и вывода можно использовать и с указанием файла, задавая соответствующий файлу поток в качестве необязательного параметра. Например, следующий вызов PRIN1 записывает выражение в файл ПРОБА.LSP, и вызов READ читает это выражение:
_(prin1 ’(в файл ПРОБА.LSP) поток) (В ФАЙЛ ПРОБА.LSP) _(setq x (read поток)) (В ФАЙЛ ПРОБА.LSP) _x (В ФАЙЛ ПРОБА.LSP) Чтобы записанные в файл данные сохранились, надо не забыть закрыть файл директивой CLOSE:
(CLOSE поток) Вообще-то работа с файлами более удобна через форму WITH-OPEN-FILE:
(WITH-OPEN-FILE (поток файл режим1 … режимN) форма1 … формаM) Вызов WITH-OPEN-FILE позволяет открыть определенный в пределах формы поток, который автоматически создается в самом начале вычислений и закрывается после их завершения. Такие характеристики потока, как его направление, задаются через:DIRECTION и другие ключи так же, как и в директиве OPEN. Формы формаi вызова WITH-OPEN-FILE вычисляются последовательно, и значение последней из них возвращается в качестве результата вызова (неявный progn). Например, приведенный ниже вызов открывает поток с именем ПОТОК1 на файл ПРОБА.LSP, читает оттуда записанное нами ранее выражение и закрывает файл. Результатом будет прочитанное выражение.
_(with-open-file (поток1 ’проба.lsp:direction:input) (read поток1)) (В ФАЙЛ ПРОБА.LSP) LOAD загружает определения На практике написание программ осуществляется записью в файл определений функций, данных и других объектов с помощью имеющегося в программном окружении редактора. После этого для проверки определений вызывают интерпретатор Лиспа, который может прочитать записанные в файл выражения директивой LOAD:
(LOAD файл) Читаемые выражения вычисляются так, как будто бы они введены пользователем. После загрузки можно использовать функции, значения переменных, значения свойств и другие определения. Стандарт Коммон Лиспа содержит кроме описанных выше средств большое количество возможностей для работы с файлами, в том числе переименование и удаление файлов. Имена файлов можно задавать либо именем относительно используемой системы (name-string), либо не зависящими от устройств логическим именем (pathname).
ЛАБОРАТОРНАЯ РАБОТА №10
1. Напишите функцию ЧИТАЙ-ФРАЗУ, которая вводит фразу на естественном языке, заканчивающуюся вопросительным или восклицательным знаком, и преобразует ее в список:
_(читай-фразу); вызов куда дует ветер?; ввод (КУДА ДУЕТ ВЕТЕР?); результат
2. Запрограммируйте функцию ЧИТАЙ, которая вводит вызов функции в виде
fn(a1 a2.. aN) и возвращает значение вызова:
_(читай) +(2 3) _(читай) cons (’a ’(b c)) (a b c)
3. Определите функцию (ЧЕРТА n), печатающую n раз звездочку (*).
4. Используя функцию ЧЕРТА, напишите функцию (ПРЯМОУГОЛЬНИК n m) заполняющую всю область n´m звездочками.
5. Определите функцию, которая спрашивает у пользователя имя и вежливо ему отвечает:
_(начали) Введите Ваше имя: Иван Прекрасно, ИВАН, программа работает!
СОДЕРЖАНИЕ ИСТОРИЯ ЛИСПА ___________________________________________________ 4
ЛИСП – ЯЗЫК ПРОГРАММИРОВАНИЯ ИСКУССТВЕННОГО ИНТЕЛЛЕКТА __________ 7
СИМВОЛЫ И СПИСКИ ________________________________________________ 13 ЛАБОРАТОРНАЯ РАБОТА №1 __________________________ 17
ПОНЯТИЕ ФУНКЦИИ _________________________________________________ 18 ЛАБОРАТОРНАЯ РАБОТА №2 __________________________ 23
БАЗОВЫЕ ФУНКЦИИ _________________________________________________ 23 ЛАБОРАТОРНАЯ РАБОТА №3 __________________________ 33
ИМЯ И ЗНАЧЕНИЕ СИМВОЛА __________________________________________ 34 ЛАБОРАТОРНАЯ РАБОТА №4 __________________________ 39 ОПРЕДЕЛЕНИЕ ФУНКЦИИ _____________________________________________ 39 ЛАБОРАТОРНАЯ РАБОТА №5 ____________________________ 47
ПЕРЕДАЧА ПАРАМЕТРОВ И ОБЛАСТЬ ИХ ДЕЙСТВИЯ _______________________ 48 ЛАБОРАТОРНАЯ РАБОТА №6 ____________________________ 52
ВЫЧИСЛЕНИЕ В ЛИСПЕ ______________________________________________ 52 ЛАБОРАТОРНАЯ РАБОТА №7 ____________________________ 65 ВНУТРЕННЕЕ ПРЕДСТАВЛЕНИЕ СПИСКОВ ________________________________ 66 ЛАБОРАТОРНАЯ РАБОТА №8 ____________________________ 79
СВОЙСТВА СИМВОЛА ________________________________________________ 79 ЛАБОРАТОРНАЯ РАБОТА №9 ____________________________ 82
ВВОД И ВЫВОД ____________________________________________________ 83 ЛАБОРАТОРНАЯ РАБОТА №10 ___________________________ 93 СПИСОК ЛИТЕРАТУРЫ
1. Цикритзис Д., Лоховски Ф. Модели данных. – М.: Финансы и статистика, 1996. 2. Э. Хювенен, Й. Сеппянен. Мир Лиспа. Методы и системы программирования. В 2-х томах. – М.: Мир, 1990. 3. А. Тей, П. Грибомон, Ж. Луи др.. Под ред. Г.П. Гаврилова. Логический поход к искусственному интеллекту. – М.: Мир, 1990.
Редактор ______________ Лицензия N __________ от_________. Подписано в печать__________. Формат__________. Бумага тип. N __. Печать офсетная. Усл. печ. л. ________. Уч.-изд. л. ________. Тираж ______ экз. Зак. N____. Редакционно-издательский отдел ДонНУ
|
||||
Последнее изменение этой страницы: 2016-09-05; просмотров: 417; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.12.163.120 (0.006 с.) |