Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

A ; два перевода строки (terpri и print)

Поиск

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 с.)