Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

В аспекте и функциональном программировании , совет описывает класс функций , которые модифицируют другие функции , когда последний выполняются; это определенная функция, метод или процедура, которые должны применяться в данной точке соединения программы.

Используйте [ редактировать ]

Практическое использование функций совета обычно состоит в том, чтобы изменить или иным образом расширить поведение функций, которые нельзя легко изменить или расширить. Emacspeak Emacs -addon широко использует совет: он должен изменить тысячи существующих модулей и функций таким образом, что он может производить аудио выход для слепых , соответствующего визуального представления Emacs, но это было бы неосуществимо , чтобы скопировать все из них и переопределить их производить аудиовыход в дополнение к их обычным выходам; Итак, программисты Emacspeak определяют функции советов, которые выполняются до и после.

Другой пример Emacs; Предположим, после того, как кто-то исправил слово с ошибкой с помощью ispell , кто-то захотел повторно проверить орфографию всего буфера. ispell-wordне предлагает такой функции, даже если слово с проверкой орфографии используется тысячу раз. Можно было отследить определение ispell-word, скопировать его в свой Emacs и написать дополнительную функциональность, но это утомительно, склонно к поломке (версия Emacs не будет синхронизироваться с фактическим модулем Ispell Elisp, если он даже работает из своего дома). То, что нужно, довольно просто: просто запустить другую команду после выполнения ispell-word. Используя функции рекомендаций, это можно сделать так просто:

 ( defadvice  ispell  ( после  совета )  ( flyspell-buffer ))  ( ad-activate  'ispell  t )

Реализации [ править ]

Форма советов была частью C с классами в конце 1970-х и начале 1980-х, а именно функции, вызываемые callи returnопределенные в классе, которые вызывались до (соответственно, после) функций-членов класса. Однако они были исключены из C ++ . [1]

Советы являются частью объектной системы Common Lisp (CLOS), as :before, :afterи :aroundметоды, которые объединены с основным методом в «стандартной комбинации методов». [2]

Реализации Common Lisp предоставляют функциональные возможности рекомендаций (в дополнение к стандартной комбинации методов для CLOS) в качестве расширений. LispWorks [3] поддерживает функции подсказки , макросы и методы CLOS.

EmacsLisp добавил код, связанный с советами, в версии 19.28 , 1994.

История [ править ]

Следующее взято из обсуждения в списке рассылки aosd-Discussion . Паскаль Костанца сделал следующее:

Термин «совет» восходит к термину « консультирование», введенному Уорреном Тейтельманом в его докторской диссертации в 1966 году. Вот цитата из главы 3 его диссертации:

Консультирование является основным нововведением как в модели, так и в системе PILOT. Консультирование состоит из вставки новых процедур в любую или все точки входа или выхода для конкретной процедуры (или класса процедур). Вставленные процедуры называются «консультационными процедурами» или просто «советами».
Поскольку каждый совет сам по себе является процедурой, он имеет свои собственные входы и выходы. В частности, это означает, что выполнение advice может привести к тому, что процедура, которую он модифицирует, будет полностью обойдена, например, указав в качестве выхода из совета один из выходов из исходной процедуры; или совет может изменить важные переменные и продолжить вычисление, так что исходная процедура будет выполнена, но с измененными переменными. Наконец, совет может не изменять выполнение или вообще влиять на исходную процедуру, например, он может просто выполнять некоторые дополнительные вычисления, такие как печать сообщения или истории записи. Поскольку совет может быть условным, решение о том, что делать, может зависеть от результатов вычислений до этого момента.
Основное преимущество советов состоит в том, что пользователю не нужно беспокоиться ни о деталях фактических изменений в его программе, ни о внутреннем представлении советов. Он может рассматривать процедуру, о которой нужно сообщить, _ как единицу_, отдельный блок, и вносить в нее изменения, не заботясь о деталях этого блока. Это можно противопоставить редактированию, при котором программист должен знать внутреннюю структуру процедуры.

«Консультирование» нашел свой путь в BBN Лиспе , а затем в Xerox PARC «s INTERLISP .

Он также нашел свое применение в Flavors , первом объектно-ориентированном расширении Lisp, разработанном в Массачусетском технологическом институте . Они были отнесены к понятию комбинации методов. [4] [а]

Поскольку комбинация методов и макросы тесно связаны, также интересно отметить, что первая макросистема была описана в 1963 году, за три года до докторской диссертации Уоррена Тейтельмана. [5] [b]

См. Также [ править ]

Заметки [ править ]

Грегор Кичалес комментирует вышесказанное следующим образом:

  1. ^ Совет появился отдельно от « Ароматизаторов в Maclisp» и « Lisp Machine» . Можно было посоветовать любую функцию, как в то время в Интерлиспе. Онтология до / после появилась отдельно в методах Flavors.
  2. ^ Комбинация методов и макросы были связаны лишь незначительно до тех пор, пока гораздо позже, в New Flavors и CLOS , не был предоставлен макро-подобный механизм, позволяющий людям определять свои собственные правила для комбинирования методов. До этого правила, управляющие комбинацией методов до / после и так называемых громоздких методов (вокруг), были исправлены, и компилятор просто сгенерировал для этого код. Были вещи, называемые обертками, которые вели себя как макросы, но я забывала, когда они появлялись. Было бы интересно изучить различные версии руководства по MacLisp и Lispm, чтобы точно понять эту часть истории. Или это могло быть так, что Говард Кэннон, Дэвид Мун или кто-то действительно мог все это точно вспомнить.

Ссылки [ править ]

  1. ^ Дизайн и эволюция C ++, стр. 57
  2. ^ «Краткое руководство по CLOS» . Архивировано из оригинала на 2015-05-06 . Проверено 27 апреля 2015 .
  3. ^ Руководство пользователя и справочное руководство LispWorks 7, Консультационная служба
  4. ^ См., Например, AIM-602 на https://web.archive.org/web/20060913001624/http://www.ai.mit.edu/research/publications/browse/0600browse.shtml
  5. ^ См. AIM-57 на https://web.archive.org/web/20060913001624/http://www.ai.mit.edu/research/publications/browse/0000browse.shtml

Внешние ссылки [ править ]

  • Кандидатская диссертация Тейтельмана (AITR-221)
  • Справочное руководство Interlisp от 1974 г.
  • «Происхождение совета»