SlideShare a Scribd company logo
Внутреннее представление списков. Применяющие функционалы . Лекция  8
Внутреннее представление списков Обработка списков без разрушения. Append  Разрушающие функции  Применяющие функционалы
Внутреннее представление списков
Структура памяти  Списочная ячейка  ( cons-ячейка ) - специальный элемент памяти,  состоит из двух полей:  CAR  и  CDR . Список  – совокупность атомов, которые связываются списочными ячейками.
Представление списков через списочную ячейку
Представление списков через точечные пары  (a) <=> (a.nil) (a b c) <=> (a.(b.(c.nil)))  (a.(b c)) <=> (a b c)   Выражение точечной нотации можно привести к списочной, если  cdr -поле – список.
Списочная ячейка и базовые функции  Результат функции  Сar  – значение левого поля первой списочной ячейки  *  (сar '(a (b c) d) a  Результат функции  Сdr  – значение правого поля первой списочной ячейки.  *  (сdr '(a (b c) d) ((b c) d)
Списочная ячейка и базовые функции CONS  создает новую списочную ячейку,  car -поле которой указывает на первый элемент, а  cdr  на второй  (cons 'x '(a b c)) .
Списочная ячейка и базовые функции LIST Создается списочная ячейка для каждого аргумента . В  car - поле ставится указатель на соответствующий элемент . В  cdr - поле ставится указатель на следующую списочную ячейку . *   (list 'a '(b c)) (a (b c))
Переменные и списки  Использование переменной в функции обеспечивает доступ к структуре . (setq y '(a b c)) CONS, не изменяя структуры, увеличивает список.  (setq x (cons 'd y))
Переменные и списки Если в функции присвоения список задается явно, под него отводятся новые   списочные ячейки (setq z '(a b c))   Переменная  z  будет иметь значение  '(a b c) .
Равенство списков EQ   –  физическое   равенство   – одинаковая структура EQUAL  – логическое   равенство – одинаковые элементы EQL  – эквивалентность символов и чисел Структура списка определяется списочными ячейками.
Пример *   (setq lis1 '(a b))  *   (setq lis2 '(a b)) *   (setq lis3 lis1) *  (equal lis1 lis2) t *  (equal lis1 lis3) t *  (eql lis1 lis2) nil *  (eql lis1 lis3) t *  (eq lis1 lis2) nil *  (eq lis1 lis3) t *   (setq m 'abc) *  (setq n 'abc) *  (eq m n) t  Для отдельного атома принцип не выполняется,  т.е. новые ячейки не отводятся.
Cборка мусора  «Мусор» - структуры, на которые нельзя ссылаться. *   (setq l1 '((a) b c)) *   (setq l1 (cdr l1))  Сборщик мусора (garbage collector) GC  – собирает ставшие мусором ячейки в область свободной памяти для использования.
Обработка списков без разрушения. Append
Обработка списков без разрушения. Append. Операции над списками не вносят изменений в указатели списочных ячеек:  создается  копия  списочной ячейки с  новым содержанием полей. Функция  APPEND *  (setq first '(a b)) (a b) *  (setq second '(c d)) (c d) *  (setq both (append first second)) (a b c d)
Структура при APPEND  Append   создает копии всех списочных ячеек для каждого элемента во всех аргументах, исключая последний. C ons  создает только одну списочную ячейку.
Разрушающие функции
Разрушающие функции  Функции, которые изменяют содержимое указателей вместо создания новых  списочных ячеек, называют  разрушающими . (т.к. указатель заменяется и исходная структура  разрушается)
NCONC  позволяет соединить два списка изменением указателя.  (setq new (nconc first second))  Список не копируется. N il  в последней списочной ячейке меняется на указатель к первой списочной ячейке второго списка.
RPLACA, RPLACD  Функции от двух аргументов (первый – список) изменяют структуру своих аргументов. rplaca  –   &quot;replace the car&quot;  – заменяет  car  первого аргумента на второй.  (Т.е. указатель car первой списочной ячейки меняется на указатель ко второму аргументу.) rplacd  –  &quot;replace the cdr&quot;  – заменяется  cdr-  указатель.
Механизм действия *  (setq lis1 '(a b c)) *  (setq lis2 '(a b c))
*  (rplaca lis1 'd) (d b c) *  (rplacd lis2 '(e f)) (a e f)  Механизм действия Через  setf (rplaca x y)  <=>  (setf (car x) y) (rplacd x y)  <=>  (setf (cdr x) y)
Пример Функция  replace-item  имеет три аргумента: первый элемент должен быть списком, разрушающе замещает первое местоположение второго аргумента в списке на третий аргумент. (defun replace-item (lis old new) (rplaca (member old lis) new)) *   ( replace-item ‘(d a s d a f) ‘a ‘n) (n s d a f)
Использование разрушающих функций  При работе с большими списками, чтобы не увеличивать расход памяти.  (Например, использовать  nconc  вместо  append .) Использование требует осторожности: побочный эффект – можно получить бесконечные списки.   *  (setq v1 '(a b c)) (a b c) *  (setq v2 v1) (a b c) *  (setq v2 (nconc v1 v2)) (a b c a b c....)
Применяющие функционалы
Применяющие функционалы  применяют функциональный аргумент к своим параметрам. APPLY  FUNCALL   Применяющие функционалы вычисляют значение функции.  (В этом смысле они аналогичны функции  EVAL , вычисляющей значение выражения.  )
APPLY  Предположим, мы хотим объединить в один список несколько вложенных списков.   APPLY применяет функцию к элементам списка, как к аргументам функции.
Пример 1 Часто  apply  используют вместе c  марсаr . Задача: найти общее число элементов в списках. *   (countall '((a b c) (d e f) (k l))) 8 (defun countall (lis) (apply '+ (mapcar 'length lis)) )
Пример 2 Функция countatom считает элементы в любом списке.  *  (countatom '(a (a (b) c) (d) e (f g))) 8 (defun countatom (lis) (cond ((null lis) 0) ((atom lis) 1) (t (apply '+ (mapcar 'countatom lis))) ) )
Cочетание apply, nconc, mapcar – mapcan  Задача: Построить функцию, образующую список из хвостов списков.  *  (list-last '((a b) (b c) (c d))) (b c d)  (defun list-last (lis) (apply 'append (mapcar 'last lis)))   APPEND  работает медленно и оставляет много мусора. Можно это сделать через  nconc :   (defun list-last (lis) (apply 'nconc (mapcar 'last lis)))
Cочетание apply, nconc, mapcar – mapcan Отображающий функционал  mapcan  объединяет результаты в один список, используя функцию  nconc . Механизм действия: (mapcan fn x1 x2 ... xN)    (apply 'nconc (mapcar fn x1 x2 ... xN))
Cочетание apply, nconc, mapcar – mapcan Задача: Построить функцию, образующую список из хвостов списков.  *  (list-last '((a b) (b c) (c d))) (b c d) (defun list-last (lis) (mapcan 'last lis))
Функционал FUNCALL Применяющий функционал  FUNCALL  аналогичен  APPLY , но аргументы  принимает не в списке, а по отдельности:  (funcall fn x1 x2 ... xN)      (fn x1 x2 ... xN)   здесь fn – функция с n аргументами.   *  (funcall '+ 1 2) <=> * (+ 1 2) 3  *  (funcall (car '(+ - / *)) 1 2) 3
Пример Рассмотрим использование  funcall  для построения функции  map2 , которая действует аналогично  mapcar , но берет в качестве аргументов два элемента из списка, а не один.  *  (map2 'list '(A Christie V Nabokov K Vonnegut))  ((A Christie) (V Nabokov) (K Vonnegut))  (defun map2 (f2 lst) (if (null lst) nil (cons (funcall f2 (car lst) (cadr lst)) (map2 f2 (cddr lst))) ) )
Блокировка функции ‘ х    (QUOTE х) # ‘f     (FUNCTION  f ) (+ 2 3) (funcall ‘+ 2 3) (funcall #‘+ 2 3)
Замыкание (defun f1 (x)  (cons  (function (lambda (y) (+ x y))) (function (lambda (y) (setq x y))))) *  (setq para (f1 10)) *  (funcall (car para) 2) ;;  1-е замыкание (для  MCL  не работает) 12 *  (funcall (cdr para) 100) ;;  2-е замыкание 100 *  (funcall (car para) 102) ;;  2-е 202
Блокировки вычисления FUNCTION или  #‘  используется тогда, когда в замыкаемой функции есть свободные переменные Если в замыкаемой функции нет свободных (глобальных функции) переменных, то форма FUNCTION ни чем не отличается от формы QUOTE
Спасибо за внимание!  Вопросы?

More Related Content

PPT
ФИЛП
PDF
Олег Алистратов — Сортировка списков в Perl и Python
PPTX
C++ осень 2012 лекция 11
PPTX
очередь
PPTX
Урок 6. Чистое лямбда-исчисление.
PDF
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...
PDF
Python. Объектно-ориентированное программирование
PPT
интегралы
ФИЛП
Олег Алистратов — Сортировка списков в Perl и Python
C++ осень 2012 лекция 11
очередь
Урок 6. Чистое лямбда-исчисление.
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...
Python. Объектно-ориентированное программирование
интегралы

What's hot (20)

PDF
Повышение конверсии через оптимизацию JS
PDF
Лекция 4: Стеки и очереди
PPT
Использование стратегии локального поиска для решения задачи об N ферзях
PDF
mri ruby GC
PPT
лабораторная работа №5
PDF
Лекция 4: Стек. Очередь
PDF
Лекция 4. MapReduce в Hadoop (введение)
PPTX
Урок 7. Интерпретация и компиляция функциональных программ.
PPT
практика 15
PDF
PPTX
Ecma script 6 yevhen diachenko
PDF
07 - Hadoop. Решение задач с помощью MapReduce
PDF
Лекция 5. MapReduce в Hadoop (алгоритмы)
PDF
Лекция 7. Введение в Pig и Hive
PPT
Синтез функциональных программ при помощи метода дедуктивных таблиц
PDF
20081026 structuralcomplexitytheory lecture05-06
PPTX
проект
PDF
Functional Programming in Python
PPTX
Java8. Innovations
PPTX
Java 8. Lambdas
Повышение конверсии через оптимизацию JS
Лекция 4: Стеки и очереди
Использование стратегии локального поиска для решения задачи об N ферзях
mri ruby GC
лабораторная работа №5
Лекция 4: Стек. Очередь
Лекция 4. MapReduce в Hadoop (введение)
Урок 7. Интерпретация и компиляция функциональных программ.
практика 15
Ecma script 6 yevhen diachenko
07 - Hadoop. Решение задач с помощью MapReduce
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 7. Введение в Pig и Hive
Синтез функциональных программ при помощи метода дедуктивных таблиц
20081026 structuralcomplexitytheory lecture05-06
проект
Functional Programming in Python
Java8. Innovations
Java 8. Lambdas
Ad

Viewers also liked (6)

PDF
IKT i skole og barnehage - perspektiver for mastergradsstudenter
PDF
What Is Media 21?
KEY
Tv2skole170812
KEY
ITU Mentor
PDF
ICT and Digital Literacy in Norwegian Schools
IKT i skole og barnehage - perspektiver for mastergradsstudenter
What Is Media 21?
Tv2skole170812
ITU Mentor
ICT and Digital Literacy in Norwegian Schools
Ad

Similar to Lisp8 (16)

PPT
01 линейные структуры данных
PDF
Лекция о языке программирования Haskell
PDF
ОПК № 5 – Составные типы данных, списки
PDF
PPT
списки (2008)
PDF
Функциональное программирование - Александр Алексеев
PDF
Абстрактные типы данных, контейнеры и списки
PPT
лекция 4
PPTX
Подпрограммы
PDF
Абстрактные типы данных, последовательности, списки
PPTX
десант презентация
PDF
Лекция 3: Бинарный поиск. Связные списки
PDF
Боремся со сложностью по-функциональному
PPTX
Algo 00
PPT
строковые величины
PDF
Haskell Type System with Dzmitry Ivashnev.
01 линейные структуры данных
Лекция о языке программирования Haskell
ОПК № 5 – Составные типы данных, списки
списки (2008)
Функциональное программирование - Александр Алексеев
Абстрактные типы данных, контейнеры и списки
лекция 4
Подпрограммы
Абстрактные типы данных, последовательности, списки
десант презентация
Лекция 3: Бинарный поиск. Связные списки
Боремся со сложностью по-функциональному
Algo 00
строковые величины
Haskell Type System with Dzmitry Ivashnev.

Lisp8

  • 1. Внутреннее представление списков. Применяющие функционалы . Лекция 8
  • 2. Внутреннее представление списков Обработка списков без разрушения. Append Разрушающие функции Применяющие функционалы
  • 4. Структура памяти Списочная ячейка ( cons-ячейка ) - специальный элемент памяти, состоит из двух полей: CAR и CDR . Список – совокупность атомов, которые связываются списочными ячейками.
  • 6. Представление списков через точечные пары (a) <=> (a.nil) (a b c) <=> (a.(b.(c.nil))) (a.(b c)) <=> (a b c) Выражение точечной нотации можно привести к списочной, если cdr -поле – список.
  • 7. Списочная ячейка и базовые функции Результат функции Сar – значение левого поля первой списочной ячейки * (сar '(a (b c) d) a Результат функции Сdr – значение правого поля первой списочной ячейки. * (сdr '(a (b c) d) ((b c) d)
  • 8. Списочная ячейка и базовые функции CONS создает новую списочную ячейку, car -поле которой указывает на первый элемент, а cdr на второй (cons 'x '(a b c)) .
  • 9. Списочная ячейка и базовые функции LIST Создается списочная ячейка для каждого аргумента . В car - поле ставится указатель на соответствующий элемент . В cdr - поле ставится указатель на следующую списочную ячейку . * (list 'a '(b c)) (a (b c))
  • 10. Переменные и списки Использование переменной в функции обеспечивает доступ к структуре . (setq y '(a b c)) CONS, не изменяя структуры, увеличивает список. (setq x (cons 'd y))
  • 11. Переменные и списки Если в функции присвоения список задается явно, под него отводятся новые списочные ячейки (setq z '(a b c)) Переменная z будет иметь значение '(a b c) .
  • 12. Равенство списков EQ – физическое равенство – одинаковая структура EQUAL – логическое равенство – одинаковые элементы EQL – эквивалентность символов и чисел Структура списка определяется списочными ячейками.
  • 13. Пример * (setq lis1 '(a b)) * (setq lis2 '(a b)) * (setq lis3 lis1) * (equal lis1 lis2) t * (equal lis1 lis3) t * (eql lis1 lis2) nil * (eql lis1 lis3) t * (eq lis1 lis2) nil * (eq lis1 lis3) t * (setq m 'abc) * (setq n 'abc) * (eq m n) t Для отдельного атома принцип не выполняется, т.е. новые ячейки не отводятся.
  • 14. Cборка мусора «Мусор» - структуры, на которые нельзя ссылаться. * (setq l1 '((a) b c)) * (setq l1 (cdr l1)) Сборщик мусора (garbage collector) GC – собирает ставшие мусором ячейки в область свободной памяти для использования.
  • 15. Обработка списков без разрушения. Append
  • 16. Обработка списков без разрушения. Append. Операции над списками не вносят изменений в указатели списочных ячеек: создается копия списочной ячейки с новым содержанием полей. Функция APPEND * (setq first '(a b)) (a b) * (setq second '(c d)) (c d) * (setq both (append first second)) (a b c d)
  • 17. Структура при APPEND Append создает копии всех списочных ячеек для каждого элемента во всех аргументах, исключая последний. C ons создает только одну списочную ячейку.
  • 19. Разрушающие функции Функции, которые изменяют содержимое указателей вместо создания новых списочных ячеек, называют разрушающими . (т.к. указатель заменяется и исходная структура разрушается)
  • 20. NCONC позволяет соединить два списка изменением указателя. (setq new (nconc first second)) Список не копируется. N il в последней списочной ячейке меняется на указатель к первой списочной ячейке второго списка.
  • 21. RPLACA, RPLACD Функции от двух аргументов (первый – список) изменяют структуру своих аргументов. rplaca – &quot;replace the car&quot; – заменяет car первого аргумента на второй. (Т.е. указатель car первой списочной ячейки меняется на указатель ко второму аргументу.) rplacd – &quot;replace the cdr&quot; – заменяется cdr- указатель.
  • 22. Механизм действия * (setq lis1 '(a b c)) * (setq lis2 '(a b c))
  • 23. * (rplaca lis1 'd) (d b c) * (rplacd lis2 '(e f)) (a e f) Механизм действия Через setf (rplaca x y) <=> (setf (car x) y) (rplacd x y) <=> (setf (cdr x) y)
  • 24. Пример Функция replace-item имеет три аргумента: первый элемент должен быть списком, разрушающе замещает первое местоположение второго аргумента в списке на третий аргумент. (defun replace-item (lis old new) (rplaca (member old lis) new)) * ( replace-item ‘(d a s d a f) ‘a ‘n) (n s d a f)
  • 25. Использование разрушающих функций При работе с большими списками, чтобы не увеличивать расход памяти. (Например, использовать nconc вместо append .) Использование требует осторожности: побочный эффект – можно получить бесконечные списки. * (setq v1 '(a b c)) (a b c) * (setq v2 v1) (a b c) * (setq v2 (nconc v1 v2)) (a b c a b c....)
  • 27. Применяющие функционалы применяют функциональный аргумент к своим параметрам. APPLY FUNCALL Применяющие функционалы вычисляют значение функции. (В этом смысле они аналогичны функции EVAL , вычисляющей значение выражения. )
  • 28. APPLY Предположим, мы хотим объединить в один список несколько вложенных списков. APPLY применяет функцию к элементам списка, как к аргументам функции.
  • 29. Пример 1 Часто apply используют вместе c марсаr . Задача: найти общее число элементов в списках. * (countall '((a b c) (d e f) (k l))) 8 (defun countall (lis) (apply '+ (mapcar 'length lis)) )
  • 30. Пример 2 Функция countatom считает элементы в любом списке. * (countatom '(a (a (b) c) (d) e (f g))) 8 (defun countatom (lis) (cond ((null lis) 0) ((atom lis) 1) (t (apply '+ (mapcar 'countatom lis))) ) )
  • 31. Cочетание apply, nconc, mapcar – mapcan Задача: Построить функцию, образующую список из хвостов списков. * (list-last '((a b) (b c) (c d))) (b c d) (defun list-last (lis) (apply 'append (mapcar 'last lis))) APPEND работает медленно и оставляет много мусора. Можно это сделать через nconc : (defun list-last (lis) (apply 'nconc (mapcar 'last lis)))
  • 32. Cочетание apply, nconc, mapcar – mapcan Отображающий функционал mapcan объединяет результаты в один список, используя функцию nconc . Механизм действия: (mapcan fn x1 x2 ... xN)  (apply 'nconc (mapcar fn x1 x2 ... xN))
  • 33. Cочетание apply, nconc, mapcar – mapcan Задача: Построить функцию, образующую список из хвостов списков. * (list-last '((a b) (b c) (c d))) (b c d) (defun list-last (lis) (mapcan 'last lis))
  • 34. Функционал FUNCALL Применяющий функционал FUNCALL аналогичен APPLY , но аргументы принимает не в списке, а по отдельности: (funcall fn x1 x2 ... xN)  (fn x1 x2 ... xN) здесь fn – функция с n аргументами. * (funcall '+ 1 2) <=> * (+ 1 2) 3 * (funcall (car '(+ - / *)) 1 2) 3
  • 35. Пример Рассмотрим использование funcall для построения функции map2 , которая действует аналогично mapcar , но берет в качестве аргументов два элемента из списка, а не один. * (map2 'list '(A Christie V Nabokov K Vonnegut)) ((A Christie) (V Nabokov) (K Vonnegut)) (defun map2 (f2 lst) (if (null lst) nil (cons (funcall f2 (car lst) (cadr lst)) (map2 f2 (cddr lst))) ) )
  • 36. Блокировка функции ‘ х  (QUOTE х) # ‘f  (FUNCTION f ) (+ 2 3) (funcall ‘+ 2 3) (funcall #‘+ 2 3)
  • 37. Замыкание (defun f1 (x) (cons (function (lambda (y) (+ x y))) (function (lambda (y) (setq x y))))) * (setq para (f1 10)) * (funcall (car para) 2) ;; 1-е замыкание (для MCL не работает) 12 * (funcall (cdr para) 100) ;; 2-е замыкание 100 * (funcall (car para) 102) ;; 2-е 202
  • 38. Блокировки вычисления FUNCTION или #‘ используется тогда, когда в замыкаемой функции есть свободные переменные Если в замыкаемой функции нет свободных (глобальных функции) переменных, то форма FUNCTION ни чем не отличается от формы QUOTE