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

Встроенные и определяемые пользователем функции

Встроенные функции обладают свойством subr или fsubr.

Встроенная функция обычна (subr), если она имеет фиксированное число аргументов и если действия, указанные в ее определении, выполняются над значениями аргументов. Функция специальная (fsubr), если хотя бы одно из условий нарушено. Во внутреннем представлении функции снабжаются соответствующим признаком (свойством). Вообще любые атомы в Лиспе в процессе вычислений ассоциируются со списком свойств. Считается что этот список произвольной длины. Пользователь может добавлять свойства и получать к ним доступ.

Пример

cdr, cons, atom, eq - обычные subr-функции

quote, plus, times - специальные fsubr-функции и формы (defun, sexpr и т.п.). В quote не вычисляется аргумент, в plus, times не фиксированное число аргументов.

В классическом Лиспе определение функции выполняется с использованием следующих форм:

( sexpr fn de)

( sfexpr fn de)

где fn - атом, наименование функции, de - определяющее выражение для функций (-выражение).

Значением обеих форм-функций является имя определяемой функции fn. Имя функции снабжается признаками: expr или fexpr, они отличаются от subr и fsubr тем, что могут иметь побочные эффекты, из-за использования свободных переменных и присваиваний этим переменным значений при помощи специальных форм. По обработке вызовов expr соответствует subr, fexpr соответствует fsubr.

Пример

Введем определение функции null:

(sexpr null (lambda (x)(eq x nil)))

Согласно определения имеем:

(null nil) -> T

(null T) -> nil.

Таким образом null действительно соответствует not.

Пример

Пусть требуется дать определение функции сравнивающей явно - выражение х со значением выражения у. Сделаем это так):

(sfexpr f (lambda (x y)(equal x (eval y ))))

Так как признак функции f - fexpr, то вычисление аргументов задерживается, но eval, затем, вычисляет значение у.

Функция eval является ключевой в Лисп системе. Эта функция вычисляет значение любого выражения. Так, имеем:

(eval (quote x)) -> значение х.

Функция eval может вычислять значение любого правильного s- выражения Лиспа, в том числе и сформированного динамически.

Вопросы для самоконтроля

  • Какие выражения являются правильными выражениями Лиспа?

  • Из каких элементов строятся списки?

  • Какие выражения представленные списками могут быть вычислены?

  • Имеются ли в Лиспе функции с произвольным числом аргументов? Какие именно?

  • Что выполняет функция quote?

  • Для чего предназначены в Лиспе функции car, cdr и cons?

  • Как выполняются следующие функции: atom, eq, eql, =, equal, null?

  • Для чего используются выражения следующего вида (lambda (список-атомов) выражение)?

  • Как выглядит полная форма cond? Для чего она используется?

  • Как различаются встроенные функции Лиспа? Какими свойствами они обладают?

  • Для чего используются выражения следующего вида ( sexpr fn de)?

  • Для чего используются выражения следующего вида ( sfexpr fn de)?

  • Что может вычислять функция eval? Является ли она встроенной в Лисп?

Вопросы на самостоятельную проработку

К оглавлению

Лекция 7. Функциональное программирование в среде Лиспа

Функциональная программа состоит из совокупности определений функций. Вычисления начинаются с вызова конкретной функции, которая в свою очередь вызывает функции, входящие в ее определение и т.д.

Чистое функциональное программирование не признает присваиваний и передачи управления. Повторные вычисления осуществляются через рекурсию. Разветвление вычислений основано на механизме обработке аргументов условного предложения. Лисп поддерживает чистое функциональное программирование и его расширение за счет внесения элементов процедурных языков, а так же специальных форм, реализующих связи со средой вычислений.

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