Функциональное программирование




Поиск на лиспе. Функционалы. Свойства символов - часть 6


/p>

Таким образом определяется специальная функция, которая используется только в MAPCAR.

Аналогично происходит с add1.

Более эффективно в этом случае использовать, т.н.

лямбда выражения:

(mapcar '(lambda (x) (+ 1 (* x x))) '(1 2 3))

сравни (defun f1 (x) (+ 1 (* x x)))

(mapcar '(lambda (x) (+ 1 x)) '(1 2 3))

Т.о. лямбда выражения позволяют определять функцию внутри другой функции.

Лямбда-выражения определяют функцию не имеющую имени.

Общая форма:

(lambda (параметры) )


Cвойства символов

В лиспе с символом можно связывать, не только

значение, но и информацию, называемую списком

свойств (property list).

Например, рассмотрим информацию o Mary:

aqe 28
occupation lawyer
salary 90
children Bill Alice Susan
свойство значение

Список свойств в этом случае выглядит

(aqe 28 occupation lawyer salary 90 children ( Bill Alice Susan))


Чтение свойства

Узнать свойство атома можно используя функцию:

(GET <cимвол> <свойство>) возвращает значение

* ( get 'Mary 'age)

28

* ( get 'Mary 'children)

( Bill Alice Susan))

* ( get 'Mary 'hobby)

nil


Присвоение свойства

Чтобы задать свойство необходимо использовать обобщенную функцию присвоения

setf

( setf ( get <символ> <свойство>) <значение>)

* ( setf ( get 'Mary 'salary) 90)

90

Сначала свойство задается, а затем извлекается. Мы поступили наоборот, хотя в нашем лиспе присутствует функция

putprop:

( putprop <символ> <значение> <свойство>)

<свойство> - нечисловой атом;

<значение> - любое выражение ;

Можно определить

(defun

putprop ( atom value property)

(setf (get atom property) value))

и использовать при работе со списками.

Свойств у атома может быть много, но у каждого только одно значение.

При внесении нового свойства, оно помещается вначале списка свойств.

* (putprop 'Mary 'cinema 'hobby)

( hobby cinema .....)


Замена свойства

Замена значения свойства производится




Содержание  Назад  Вперед