Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Lr_2_LISP

.doc
Скачиваний:
4
Добавлен:
23.03.2015
Размер:
105.98 Кб
Скачать

ЛАБОРАТОРНАЯ РАБОТА N 2

РАБОТА СО СПИСКАМИ

ЦЕЛЬ РАБОТЫ: изучение функций для работы со списками, изучение методов обработки списков с использованием рекурсии, приобретение навыков написания функций для работы со списками.

Постановка задачи

Списки являются основными типами данных языка Лисп. Под списком понимается конечная последовательность элементов списка, заключенная в круглые скобки. Элементом списка может быть либо атом, либо список. Первый элемент списка называется головой списка, а остаток списка (без первого элемента) - хвостом списка. Атомом называется произвольная последовательность букв и цифр, заключенная между двумя ограничителями языка Лисп. Литеральный атом часто называется символом. В языке Лисп определены два стандартных атома T и NIL, выполняющие роль понятий ИСТИНА и ЛОЖЬ. Строго говоря, числа в Лиспе также являются атомами. Пример списка: (А (B (C))). Данный список состоит из двух элементов: атома A и списка (B (C)), который в свою очередь состоит из атома A и списка (C). Пустой список - это список, не содержащий ни одного элемента. Он обозначается () или атомом NIL. Пустой список в Лиспе относится к атомам.

Список представляет собой ссылочную структуру. Основная ссылочная структура языка - так называемая точечная пара, которая состоит из указателей на первый и второй элементы пары. Так, например, точечная пара с указателями на атомы A и B изображается в символьной нотации как (A.B). Если точечная пара первым указателем ссылается на атом A, а вторым - на другую точечную пару (B.C), то это изображается в символьной нотации как (A.(B.C)).

Список (A B C D) в точечной нотации будет иметь следующий вид:

(A.(B.(C.(D.NIL)))).

Под S-выражением в языке Лисп понимается либо атом, либо список. В языке Лисп с точки зрения синтаксиса программы и данные не различаются. Любое S-выражение Лиспа можно интерпретировать как программу. Интерпретацию S-выражений выполняет функция EVAL. Однако не любое S-выражение может быть удачно интерпретировано из-за семантических соображений. Можно выделить некоторые общие правила интерпретации S-выражений:

1) Если S-выражение является числом или атомом T или NIL, то EVAL возвращает это S-выражение без изменений;

2) Если S-выражение является литеральным атомом, то функция EVAL возвращает последнее значение, которое было присвоено этому атому, в противном случае возвращается сообщение об ошибке;

3) Если S-выражение представляет собой список вида (f arg1 arg2 ... argN), то функция EVAL пытается интерпретировать его следующим образом: первый элемент списка интерпретируется как имя функции, которую необходимо выполнить, взяв в качестве аргументов оставшиеся элементы списка arg1, arg2,...,argN. В случае удачи функция EVAL возвращает S-выражение, являющееся результатом выполнения функции f. Функция f может быть встроенной или определенной пользователем.

В некоторых случаях не надо вычислять значение выражения, а нужно само выражение. Чтобы предотвратить вычисление значения выражения, нужно перед этим выражением поставить апостроф '. Апостроф перед выражением - это на самом деле сокращение лисповской формы (QUOTE <выражение>), где QUOTE - специальная функция, которая возвращает невычисленный аргумент <выражение>.

_ '(+ 2 3)

(+ 2 3)

_ (+ 2 3)

5

Здесь и ниже в примерах знак "_" означает приглашение интерпретатора CLisp. После данного знака набирается интерпретируемое выражение. Ответ интерпретатора представляется на второй строке.

Базисными функциями обработки S-выражений являются: CAR, CDR, CONS, ATOM и EQ.

Вызов функции CAR: (CAR <список>). Функция CAR возвращает в качестве значения первый (головной) элемент списка-аргумента. Тип результата - S-выражение.

_ (CAR '((1 2) 3))

(1 2)

Вызов функции CDR: (CDR <список>). Функция CDR возвращает в качестве значения хвостовую часть списка-аргумента. Тип результата - список.

_ (CDR '((1 2) 3))

(3)

_ (CDR 'A)

NIL

Функции CAR и CDR позволяют добраться до любого элемента любого списка. Например, до второго элемента списка можно добраться с использованием следующего S-выражения: (CAR (CDR <список>)).

_ (CAR (CDR '(1 2 3 4)))

2

Для композиции функций CAR и CDR введены специальные обозначения. В CLisp это - CxxR, CxxxR, CxxxxR, где x - это буква A или D. Например, вызов (CADR X) эквивалентен вызову (CAR (CDR X)).

_ (CADR '(1 2 3 4))

2

Функция CONS (construct) строит новый список из переданных ей в качестве аргументов головы (S-выражение) и хвоста (списка):

(CONS <голова списка><хвост списка>).

_ (CONS 'A '(B C))

(A B C)

_ (CONS '(A B) '(C D))

((A B) C D)

Предикат ATOM проверяет, является ли аргумент атомом. Аргументом может быть любое S-выражение. Значение предиката равно T, если значение аргумента - атом, и NIL, когда значение аргумента - не атом.

_ (ATOM 'X)

T

Предикат EQ проверяет тождественность двух символов. Предикат EQ принимает значение T, если символы идентичны, и значение NIL во всех других случаях, включая случаи, когда аргументами являются не символы.

_ (EQ (CAR '(A A))(CAR '(A B C D)))

T

Более общим по сравнению с EQ является предикат EQL, который дополнительно позволяет сравнивать однотипные числа и строки.

Обобщением EQL является предикат EQUAL, позволяющий проверять одинаковость двух списков:

_ (EQUAL '(X Y Z) '(X Y Z))

T

Основными функциями, изменяющими физическую структуру списков, являются RPLACA (replace CAR) и RPLACD (replace CDR):

(RPLACA <список><выражение>)

(RPLACD <список><выражение>)

Функция RPLACA заменяет первый элемент списка, а функция RPLACD - остаток списка значением выражения. Обе функции возвращают список после его изменения.

Условные выражения в Лиспе обычно строятся с использованием функции COND. Структура условного выражения такова:

(COND (p1 e1) (p2 e2)...(pN eN)),

где p1,p2,...,pN - предикаты, а e1,e2,...,eN - произвольные результирующие выражения.

Значение функции COND определяется следующим образом:

1. Вычисляются последовательно слева направо значения выражений pi до тех пор, пока не встретится выражение, значение которого отлично от NIL, что интерпретируется как ИСТИНА.

2. Вычисляется результирующее выражение, соответствующее этому предикату, и полученное значение возвращается в качестве значения функции COND.

3. Если истинного предиката нет, то значением COND будет NIL.

В условном выражении может отсутствовать результирующее выражение pi или на его месте часто может быть последовательность выражений: (COND (p1 e11)...(pi)...(pk ,k2...ekn)...).

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

Символы в языке Лисп могут иметь значения. Изначально у символов нет какого-либо значения. Значения символам присваиваются при помощи псевдофункций (иначе, функций с побочным эффектом, причем основным действием и является этот побочный эффект) SET, SETQ, SETF. Вызов функции SETQ имеет следующий вид: (SETQ <sym><expr>), где <sym> - символ (не вычисляется), <expr> - выражение, описывающее новое значение символа. Функция возвращает значение символа. Функция SET аналогична функции SETQ, но в отличие от последней ее аргумент не вычисляется.

_ (SETQ A 'B)

B

_ (SET A 7)

7

_ B

7

Наряду со значением любой символ в языке Лисп может иметь специальный присоединенный список, называемый списком свойств. Структура этого списка: (p1 v1 p2 v2 ... pn vn), где p1,p2,...,pn - атомы, обозначающие имена свойств (называемые иногда индикаторами), v1,v2,...,vn - S-выражения, соответствующие значениям этих свойств. Выяснить значение свойства, связанного с символом, можно с помощью функции GET: (GET <символ><свойство>).

Присваивание нового свойства или изменение значения существующего свойства осуществляется псевдофункцией PUTPROP:

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

Удаление свойства и его значения осуществляется псевдофункцией REMPROP: (REMPROP <символ><свойство>).

Ассоциативным списком (а-списком) в Лиспе называется список точечных пар вида: ((k1.v1)(k2.v2)...(kn.vn)). Первый элемент пары называется ключем, а второй - связанными с ключем данными. Функция ASSOC ищет пару, соответствующую ключу в а-списке: (ASSOC <ключ><a-список>). Поиск ведется от первой пары списка к последней. Функция ACONS добавляет новую пару в начало списка.

Определить новую функцию в языке Лисп можно с помощью функции DEFUN:

(DEFUN <sym> (<arg1><arg2>...<argN>)<expr1><expr2>...<exprM>),

где <sym> - имя определяемой функции, <arg1><arg2>...<argN> - атомы, используемые для указания формальных аргументов функции, <expr1><expr2>...<exprM> - любые S-выражения, составляющие тело функции. Функция возвращает символ <sym>. Для определения неименованных функций в Лиспе используются LAMBDA-выражения.

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

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

(defun belongs (elem list)

(cond ((null list) NIL)

((eq elem (car list)) T)

(T (belongs elem (cdr list)))))

(defun intersect (list1 list2)

(cond ((null list2) NIL)

((belongs (car list2) list1)

(cons (car list2)(intersect list1 (cdr list2))))

(T (intersect list1 (cdr list2)))))

Первая из приведенных функций (belongs) используется для определения, принадлежит ли элемент elem списку list. Функция возвращает T - если принадлежит, и NIL - иначе. Таким образом, данная функция является предикатом.

_ (BELONGS 'B '(A B C D))

T

Тело функции belongs состоит из условного предложения, имеющего три ветви:

1) Если список list пустой (определяется предикатом null), то возвращается значение NIL. Данный список может быть пустым либо с самого начала, либо потому, что просмотр списка окончен.

2) Если первым элементом списка list является искомый элемент elem, то возвращается T.

3) Ни одно из предыдущих утверждений не верно: в таком случае либо элемент содержится в хвосте списка, либо вовсе не входит в список. Для продолжения решения задачи применяем тот же предикат belongs к хвосту списка. Таким образом, задача свелась к прежней, но на шаг более короткой.

Вторая функция (intersect) формирует список-результат из тех элементов, которые входят в список list1 и list2 одновременно. Функция intersect состоит из условного предложения, имеющего три ветви:

1) Если список list2 пуст, то возвращается NIL.

2) Если первый элемент списка list2 принадлежит списку list1, то этот элемент включается как голова результирующего списка.

Хвост данного списка формируется как результат пересечения списка list1 и хвоста списка list2.

3) Ни одно из предыдущих условий не верно. В этом случае результирующий список получается как результат пересечения списка list1 и хвоста списка list2.

_ (INTERSECT '(A B C D) '(X D E C))

(C D)

Для отладки Лисп-программы следует использовать средства трассировки. Трассировка какой-либо в CLisp включается при помощи функции TRACE:

(TRACE '<имя функции>).

_ (TRACE 'INTERSECT)

TRACE

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

ВАРИАНТЫ ЗАДАНИЙ НА ВЫПОЛНЕНИЕ

Ниже приводятся спецификации функций, которые необходимо реализовать на языке Лисп. Вариант, помеченный символом *, включает два подварианта: подвариант а) - действия функции распространяются только на список верхнего уровня; подвариант б) – рассматриваются подсписки всех уровней (замечание: во втором случае использовать рекурсию как по хвостам, так и по головам списков). Приведенные функции для удобства разбиты по темам.

A) Операции над списками

1) Функция COPY - создает в списочной памяти второй экземпляр произвольного S-выражения.

2) Функция LENGTH - возвращает в качестве значения длину списка [*].

3) Функция APPEND - соединяет два списка в один новый список.

4) Функция REMOVE - удаляет из списка все совпадающие с данным атомом элементы и возвращает в качестве значения список из всех оставшихся элементов [*].

5) Функция REMOVEF - удаляет из списка первые вхождения данного элемента [*].

6) Функция REMOVEL - удаляет из списка последний элемент [*].

7) Функция SUBSTITUE - заменяет все вхождения данного элемента в списке на новый элемент [*].

8) Функция REVERSE - изменяет порядок элементов в списке на обратный [*].

9) Функция FIRST-ATOM - результатом функции является первый атом списка (в учет принимаются списки всех уровней).

10) Функция LAST - возвращает последний элемент списка.

11) Функция ADDIFNONE - проверяет, содержится ли заданный элемент (значение первого аргумента) в заданном списке (значение второго аргумента), и если нет, то добавляет этот элемент к списку [*].

12) Функция COLLECT - перегруппирует элементы заданного списка так, чтобы одинаковые элементы, если они есть в списке, стояли все подряд [*].

13) Функция FLATTEN - устраняет в произвольном S-выражении все внутренние скобки, а в точечных выражениях - и точки, превращая его в список атомов. Количество и относительный порядок атомов в выражении сохраняются.

14) Функция REVL - обращает список и разбивает его на уровни.

Пример: исходный список - (a b c), результирующий список - (((c) b) a).

15) Функция DEVLEV1 - разбивает список на уровни.

Пример: исходный список - (a b c), результирующий список - (a (b (c))).

16) Функция DEVLEV2 - разбивает список на уровни.

Пример: исходный список - (a b c), результирующий список - (((a) b) c).

17) Функция DESTLEV1 - убирает уровни в списке.

Пример: исходный список - (a (b (c))), результирующий список - (a b c).

18) Функция DESTLEV2 - убирает уровни в списке.

Пример: исходный список - (((a) b) c), результирующий список - (a b c).

19) Функция REMSEC - удаляет из списка каждый второй элемент [*].

20) Функция DEVPAIR - разбивает список на пары.

Пример: исходный список - (a b c d ...), результирующий список - ((a b)(c d)...).

21) Функция MIX - чередует элементы двух списков-аргументов и образует новый список.

Пример: исходные списки - (a b ...) и (1 2 ...), результирующий список - (a 1 b 2 ...).

22) Функция DEPTH - вычисляет глубину списка (самой глубокой ветви).

B) Функции с побочным эффектом

1) Функция ATTACH - вырабатывает то же значение, что и CONS, но, в отличие от CONS, она заставляет обладать этим значением свой второй аргумент.

2) Функция DREVERSE - вырабатывает то же значение, что и REVERSE, но разрушает свой аргумент.

3) Функция NCONC - вырабатывает то же значение, что и APPEND, но одновременно она заставляет обладать этим значением свой первый аргумент.

4) Функция TCONC - помещает значение своего первого аргумента в конец очереди, представленной вторым аргументом. Если эта очередь пуста, то формируется очередь, состоящая из одного элемента.

Под очередью понимается списочная структура, состоящая из некоторого списка и лисповской ячейки, содержащей указатели на первый и последний элементы этого списка.

5) Функция EFFACE - значением второго аргумента функции должен быть список. Если этот список содержит хотя бы один элемент, совпадающий со значением первого аргумента, то первый по порядку из этих элементов исключается из списка, в противном случае список не меняется. Значением функции является преобразованный список. Если выброшенный элемент не был самым первым в списке, то значением второго аргумента также становится преобразованный список.

6) Функция DREMOVE - в отличие от EFFACE, выбрасывает из списка, являющегося значением ее второго аргумента, все элементы, совпадающие со значением первого аргумента функции.

7) Предикат LCYCLEP - вырабатывает значение Т, если в значении аргумента есть цикл по цепочке d-указателей, и NIL в противном случае, т.е. если в результате многократного применения функции CDR к значению аргумента можно получить атом.

8) Предикат CYCLEP - вырабатывает значение Т, если значение аргумента - циклическая списочная структура, и значение NIL, если в значении аргумента нет циклов.

C) Предикаты

Предикаты FORALL, FORSOME, FORODD - у этих предикатов по два аргумента. Значением первого аргумента должен быть некоторый список L, а второго (функционального) аргумента - наименование или определяющее выражение функции Р.

1) Предикат FORALL - принимает значение Т лишь в том случае, если функция Р принимает значение "истина" (т.е. не NIL) на всех элементах списка L.

2) Предикат FORSOME - принимает значение Т, если функция Р принимает значение "истина" хотя бы на одном элементе списка L.

3) Предикат FORODD - принимает значение Т, если число элементов списка L, на которых функция P принимает значение "истина", нечетно.

4) Предикат ATOMLIST - проверяет, является ли его аргумент списком (возможно, пустым), составленным лишь из атомов.

5) Предикат LISTP - принимает значение NIL, если заданное выражение является атомом, отличным от NIL, или выражением, которое может быть записано только в точечных обозначениях. В противном случае заданное выражение является списком, который можно записать, не прибегая к точечным обозначениям ни на одном из уровней, и предикат принимает значение Т.

6) Предикат ONELEVEL - проверяет, является ли аргумент одноуровневым списком.

D) Порядок и упорядочение списков

1) Предикат ORDER - проверяет, в каком порядке два заданных элемента встречаются в данном списке. Список (упорядочивающая последовательность) задается в качестве значения третьего аргумента функции ORDER. Если при просмотре элементов этого списка слева направо встречается элемент, совпадающий со значением первого аргумента, а ни один из ранее просмотренных элементов не совпал со значением второго аргумента, то значение предиката равно Т, во всех остальных случаях оно равно NIL.

2) Предикат ORDER1 - вычисляется так же, как и ORDER, однако, если ни один из заданных элементов не содержится в данном списке, то в качестве значения предиката выдается атом ORDERUNDEF.

3) Предикат LEXORDER - сравнивает - элемент за элементом - два списка, заданные как значения первого и второго аргументов. Если в какой-либо позиции обнаруживаются различные элементы, то они сравниваются между собой с помощью предиката ORDER1, причем в качестве третьего аргумента (упорядочивающей последовательности) указывается третий аргумент обращения к LEXORDER. Результат сравнения (T,NIL,ORDERUNDEF) выдается в качестве значения предиката LEXORDER. Eсли раньше, чем встретятся различные элементы, исчерпается первый список, то выдается результат Т, если первым исчерпается второй список, то в качестве результата выдается NIL.

4) Предикат LEXORDER1 - отличается от LEXORDER тем, что значением третьего аргумента для него должен быть список, каждая позиция которого в свою очередь является списком, который используется в случае необходимости для сравнения соответствующих позиций списков, заданных в качестве значений первых двух аргументов.

5) Функция FIRST - среди элементов списка, заданного в качестве значения первого аргумента, выбирает тот, который раньше встречается в списке, заданном в качестве значения второго аргумента. Если ни один из элементов первого списка не содержится во втором, то выбирается первый элемент первого списка.

6) Функция RANK - упорядочивает список, заданный в качестве ее первого аргумента, переставляя его элементы в той последовательности, в какой они встречаются в списке, являющемся значением второго аргумента.

E) Поиск в списках

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

1) Функция POSSESSING - образует список из всех элементов данного списка, обладающих заданным свойством.

2) Функция SUCHTHAT - выбирает из заданного списка первый элемент, обладающий заданным свойством. Если такого элемента нет, то вырабатывается значение NIL.

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

4) Функция SUCHTHAT2 - проверяет, содержится ли в данном списке хотя бы один элемент с заданным свойством. Если да, то к хвосту заданного списка, начиная с найденного элемента, применяется функция, наименование или определяющее выражение которой задано в качестве значения третьего аргумента (функционального). Если нет, то вырабатывается значение NIL.

5) Функция FIRST-COIN - возвращает первый элемент, входящий в оба списка X и Y, в противном случае - NIL.

F) Операции над множествами

Cписки рассматриваются как множества своих элементов - порядку элементов в списке не придается значения, а два или более одинаковых элемента списка рассматриваются как один элемент множества.

1) Функция SETOF - для каждого повторяющегося элемента исключает из списка все вхождения, кроме одного.

2) Функция MAKESET - делает то же, что SETOF, но описана через PROG. Порядок элементов в результирующем списке оказывается другим.

3) Функция DIFLIST - вычисляет разность множеств X\Y. Иначе говоря, она исключает из списка, заданного в качестве значения первого аргумента функции все элементы, встречающиеся в списке, представленном значением второго аргумента.

4) Фукция SUBSET - вычисляет предикат "множество X является подмножеством множества Y". Иначе говоря, она вырабатывает значение Т, если каждый элемент списка, заданного в качестве первого аргумента функции, содержится в списке, представленном значением второго аргумента.

5) Функция UNION - вычисляет объединение двух множеств. Значение функции представляет собой список всех выражений, являющихся элементами хотя бы одного из заданных списков. Если каждый из заданных списков не содержал повторяющихся элементов, то в результирующий список каждый элемент войдет лишь один раз.

6) Функция LUNION - объединяет множества, заданные в качестве элементов списка, являющегося значением аргумента функции.

7) Функция INTERSECTION - вычисляет пересечение двух множеств. Значением функции является список всех выражений, входящих элементами в оба заданных списка. Если каждый из заданных списков не содержит повторяющихся элементов, то в результирующемся списке элементы не будут повторяться.

8) Предикат EQUALSET - проверяет, равны ли множества, представленные двумя заданными списками.

9) Функция CART - образует декартово произведение двух заданных множеств. Точнее говоря, она формирует лексикографически упорядоченный список, элементами которого являются всевозможные списки, содержащие по два элемента каждый, причем первый элемент берется из первого, а второй - из второго заданного списка.

10) Предикат SETP - проверяет, является ли список множеством, т.е. входит ли каждый элемент в список лишь один раз.

11) Функция SIMDIFF - формирует множество из элементов, не входящих в оба множества (симметрическая разность множеств).

G) Ассоциативные списки

1) Функция PAIR - объединяет элементы двух заданных списков в ассоциативный список, вырабатываемый в качестве значения функции. Функция не определена, если второй из заданных списков короче первого.

2) Функция DPAIR - действует аналогично PAIR, но значение первого аргумента заменяется значением функции.

3) Функция ASSOC - вырабатывает в качестве значения первую по порядку пару из заданного ассоциативного списка, у которой первый элемент совпадает с заданным выражением. Если такой пары нет, то вырабатывается значение NIL.

4) Функция PAIRLIS - подобна функции PAIR и отличается от нее лишь тем, что она не создает ассоциативный список, а добавляет новые пары к существующему списку.

5) Функция SUBST - подставляет в заданное выражение Z (в значение ее третьего аргумента) выражение X (значение первого аргумента) вместо всех подвыражений, совпадающих со значением Y второго аргумента (на какой бы глубине они не находились). Результат подстановки выдается в качестве значения функции.

6) Функция SUBLIS - в заданном выражении Y (значение ее второго аргумента) заменяет все входящие в него атомы, которым в заданном ассоциативном списке (значение первого аргумента) поставлены в соответствия некоторые выражения, этими выражениями. Преобразованное выражение выдается в качестве значения функции. Функция SUBLIS обращается к функции SUB2, которая для заданного атома (значения второго аргумента) выдает в качестве значения либо выражение, поставленное ему в соответствие в заданном ассоциативном списке, либо сам этот атом, если такого выражения нет.

7) Функция SASSOC - подобна функции ASSOC и отличается от нее тем, что, когда в заданном ассоциативном списке не найдено никакого соответствия для заданного выражения, в качестве значения выдается результат обращения к функции (без аргументов), наименование или определяющее выражение которой задано в качестве третьего аргумента функции SASSOC.

H) Функционалы

1) Функция APL-APPLY - применяет каждую функцию fi списка f=(f1 f2 ... fN), являющегося первым аргументом функции, к соответствующему элементу xi списка x=(x1 x2 ... xN), являющегося вторым аргументом функции, и возвращает список, сформированный из результатов.

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