stringtranslate.com

Анафорический макрос

Анафорический макрос — это тип макроса программирования , который намеренно фиксирует некоторую форму, предоставленную макросу, на которую можно сослаться с помощью анафоры (выражения, ссылающегося на другое). Анафорические макросы впервые появились в книге Пола Грэма On Lisp [1] , а их название является отсылкой к лингвистической анафоре [1] — использованию слов в качестве замены предшествующих слов.

Примеры

Макрос loopв ANSI Common Lisp является анафорическим по связыванию, где itвыражение ссылается на результат тестового выражения в предложении. [2] [3]

Вот пример, который суммирует значения не- nilэлементов, где itотносится к значениям элементов, которые не равны nil:

 ( цикл для элемента в ' ( nil 1 nil 2 nil nil 3 4 6 ) когда элемент суммирует его ) ;; ⇒ 16                 

Здесь itпривязан к выходным данным (and (> number 3) number)при значении true, собирая числа больше 3: [4]

 ( цикл для числа от 1 до 6, когда ( и ( > число 3 ) число ) собирают его ) ; ЭТО относится к (и ( > число 3) числу). ;; ⇒ (4 5 6)                

Определение анафорических макросов

Одним из примеров является анафорическая версия конструкции if-then-else , которая вводит анафору it , привязанную к результату тестового предложения: [5]

 ( defmacro aif ( test-form then-form &optional else-form ) ` ( let (( it , test-form )) ( if it , then-form , else-form )))             ( aif ( + 2 7 ) ( format nil "~A не равно NIL." it ) ( format nil "~A равно NIL." it )) ;; ⇒ "9 не равно NIL."            

Другим примером является анафорическая версия λ-функции , которая связывает саму функцию с анафором self , позволяя ей повторяться : [5]

 ( defmacro alambda ( parms &body body ) ` ( labels (( self , parms ,@ body )) #' self ))          ;; Факториальная функция определена рекурсивно, где `self' относится к аламбда-функции ( alambda ( n ) ( if ( = n 0 ) 1 ( * n ( self ( 1- n )))))              

Смотрите также

Ссылки

  1. ^ ab Глава 6 Let над Лямбда
  2. ^ 22. LOOP для обладателей черных поясов из Practical Common Lisp
  3. ^ Какой пример анафорического условного оператора можно привести в Lisp? на StackOverflow
  4. ^ 6.1.8.1 Примеры группировки предложений из Common Lisp HyperSpec
  5. ^ ab Глава 14. Анафорические макросы Архивировано 26 апреля 2012 г. на Wayback Machine из On Lisp Полом Грэмом

Внешние ссылки