Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Spec_Mov_3k_4k_Lect.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.46 Mб
Скачать

Lambda-списки

В Xlisp список параметров (lambda-список) в декларации функции расширен по сравнению с тем, как он выглядит в базовом Лиспе.

  1. Вначале перечисляются обязательные параметры. В вызовах функции им обязательно должны сопоставляться выражения.

  2. Затем перечисляются опционные (необязательные) параметры. Им предшествует атом &optional. Каждому опционному параметру можно сопоставить инициализирующее выражение. Если в вызове параметру не сопоставляется выражение и отсутствует инициализирующее выражение, то параметр получает значение nil. Кроме того, опционному параметру можно сопоставить присоединяющую переменную, которая получает значение t, если в вызове для параметра было сопоставлено выражение.

  3. Затем в списке параметров следует rest-аргумент, который указывается после ключевого символа &rest. Ему сопоставляется хвост списка значений из вызова, после того, как обязательным и опционным параметрам были сопоставлены значения выражений из вызова функции.

  4. Затем следуют ключевые параметры. Им предшествует атом &key. Ключевой параметр указывается атомом с префиксом :(двоеточие). Ключевому параметру так же, как и опционному можно сопоставлять инициализирующее выражение и присоединяемую переменную.

  5. Список завершают локальные переменные, которым предшествует атом &aux. Если локальным переменным не сопоставлены инициализирующие выражения, то они приобретают значение nil.

Пример

>(defun fn (x &optional (y (+ x 2)))

(list x y))

fn

>(fn 2)

(2 4)

>(fn 2 5) ;опционному параметру сопоставляется значение 5

(2 5)

Пример

>(defun fn1 (x &optional (y nil y1) &rest z) ;y1 – присоединяемая переменная

(list x (if y1 y x) z))

fn1

>(fn1 ‘a)

( a a nil)

>(fn1 ‘a ‘b ‘c ‘d)

(a b (c d))

Пример

>(defun fn2 (&key x y ((:a z) nil z1))

(list x y (if z1 z y)))

fn2

>(fn2 :y 3 :x 2)

(2 3 3)

>(fn2 :a 4 :y 2)

(nil 2 4)

Если ключевой параметр в декларации указан без префикса, то он префиксуется двоеточием автоматически. Третий ключевой параметр в примере указан парой (:a z), что означает, что в вызовах необходимо указывать параметр в виде :a, а в теле функции как z.

Функции ввода/вывода

В Лисп включен обширный набор функций ввода-вывода, для работы с файлами и потоками. Так, print, prin1, princ выполняют вывод данных в новую строку, в ту же строку или в ту же строку, но в некотором преобразованном виде, соответственно. Кроме отображаемого результата, в стандартный поток вывода, если не указан параметр-поток, эти функции еще возвращают и некоторый вычисленный результат.

Пример

>(+ (print 2) 3)

2

5

>(prong (prin1 1) (prin1 2) (prin1 3))

12

3

Функции open и close выполняют, соответственно, открытие файла (и связывание его с потоком) и закрытие потока. Функции read, read-byte, read-line, read-char обеспечивают, соответственно, чтение выражения, байта, строки(ВК_ПС в конце) или литеры из входного потока.

Пример

>(eval (read)) ; чтение выражения и его вычисление

(setq x 1)

1

>(do* ((fp (open “myf.lsp” :direction :input))

(ex (read fp) (read fp))) ; fp и ex – параметры цикла

((null ex) (close fp) x)

(print (eval ex)))

2

2

2

>

В файле myf.lsp были размещены следующие выражения Лиспа:

(setq x 2)

x

nil

Вначале выполняется открытие файла “myf.lsp” и открытый поток связывается с параметром цикла fp. В дальнейшем этот параметр не изменяется, так как для него не указано выражение, обеспечивающее новое значение для параметра цикла. На каждом шаге итерации параметр цикла ex получает в качестве значения очередное выражение из потока, которое вычисляется формой eval и выводится в стандартный поток вывода формой print. Цикл завершается закрытием файла и возвратом в качестве результата значения переменной x.

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