Jump to content

М-выражение

Джон Маккарти

В компьютерном программировании М -выражения (или метавыражения ) были ранним предложенным синтаксисом для языка программирования Лисп , вдохновленным современными языками, такими как Фортран и АЛГОЛ . Эта нотация так и не была реализована в языке и, как таковая, никогда не была доработана. [1]

М-выражения представляют собой синтаксис кода LISP и обеспечивают обозначение функций , синтаксис для cond форме и для встроенных литеральных данных (через S-выражения) в программы. Таким образом, M-выражения использовали S-выражения для буквальных данных. Синтаксис S-выражений («Язык данных») и M-выражений («Метаязык») определен на страницах 8 и 9 руководства по Lisp 1.5. [2]

M-выражения также имели соответствующее представление S-выражений. Код был вручную переведен из M-выражений в S-выражения. В M-выражениях были встроены литеральные данные, которые затем приходилось заключать в кавычки в S-выражениях.

Форма M-выражения

append[listvar;(PARIS BERLIN NEWYORK TOKYO)]

затем необходимо преобразовать в форму S-выражения

(APPEND LISTVAR (QUOTE (PARIS BERLIN NEWYORK TOKYO)))

Предыстория [ править ]

Джон Маккарти опубликовал первую статью о Лиспе в 1960 году, будучи научным сотрудником Массачусетского технологического института . В ней он описал язык символических выражений ( S-выражений ), который мог представлять сложные структуры в виде списков. Затем он определил набор примитивных операций над S-выражениями и язык метавыражений (M-выражений), который можно было использовать для определения более сложных операций. Наконец, он показал, как сам метаязык может быть представлен с помощью S-выражений, в результате чего появилась система, которая потенциально была самодостаточной . [3] Черновая версия этого документа известна как «AI Memo 8». [4]

Примеры M-выражений (LISP 1.5, 1965 г.) и их представление S-выражений [2]
Тип выражения LISP M-выражение соответствующее S-выражение LISP
Буквальный атомный символ, написанный заглавными буквами. ALPHA123 (QUOTE ALPHA123)
Список букв в обозначении минусов (A . (B . NIL)) (QUOTE (A . (B . NIL)))
Буквенный список в списочной записи (A B C 1 2 3) (QUOTE (A B C 1 2 3))
Идентификатор переменных и функций, записанный строчными буквами в M-выражениях. name123 NAME123
Приложение функции с переменными f[x;y] (F X Y)
Приложение функции на S-выражении car[(A B C)] (CAR (QUOTE (A B C)))
Применение функции на двух S-выражениях cons[A;(B C D)] (CONS (QUOTE A) (QUOTE (B C D)))
Условное выражение [lessp[x;0] → minus[x]; T → x] (COND ((LESSP X 0) (MINUS X)) (T X))
Определение рекурсивной функции label[ff;λ[[x];[atom[x] → x; T → ff[car[x]]]]] (LABEL FF (LAMBDA (X) (COND ((ATOM X) X) (T (FF (CAR X))))))

Маккарти планировал разработать автоматический компилятор Лиспа ( LISP 2 ), используя M-выражения в качестве синтаксиса языка и S-выражения для описания внутренних процессов компилятора. Стивен Б. Рассел прочитал статью и предположил, что S-выражения являются более удобным синтаксисом. Хотя Маккарти не одобрял эту идею, Рассел и его коллега Дэниел Дж. Эдвардс вручную написали программу- интерпретатор , которая могла выполнять S-выражения. [2] Эта программа была принята исследовательской группой Маккарти, сделав S-выражения доминирующей формой Лиспа.

Маккарти размышлял о судьбе М-выражений в 1979 году:

Проект точного определения М-выражений и их компиляции или, по крайней мере, перевода в S-выражения не был ни завершен, ни заброшен явно. Оно просто отошло в неопределенное будущее, и появилось новое поколение программистов, которые предпочитали внутреннюю нотацию любой нотации, подобной FORTRAN или ALGOL, которую можно было изобрести. [5]

Книга Джона Аллена «Анатомия LISP» объясняет определение M-выражений и использует их на протяжении всей книги для объяснения Lisp и его реализации. [6]

Примеры [ править ]

Определения функций применяются и оцениваются из Руководства по Lisp 1.5, стр. 13.

apply[fn;x;a] =
   [atom[fn] →
       [eq[fn;CAR] → caar[x];
        eq[fn;CDR] → cdar[x];
        eq[fn;CONS] → cons[car[x];cadr[x]];
        eq[fn;ATOM] → atom[car[x]];
        eq[fn;EQ] → eq[car[x];cadr[x]];
        T → apply[eval[fn;a];x;a]];
    eq[car[fn];LAMBDA] → eval[caddr[fn];parlis[cadr[fn];x;a]];
    eq[car[fn];LABEL] → apply[caddr[fn];x;cons[cons[cadr[fn];caddr[fn]];a]]]
eval[e;a] =
   [atom[e] → cdr[assoc[e;a]];
    atom[car[e]] →
          [eq[car[e],QUOTE] → cadr[e];
           eq[car[e];COND] → evcon[cdr[e];a];
           T → apply[car[e];evlis[cdr[e];a];a]];
    T → apply[car[e];evlis[cdr[e];a];a]]

Использование функции eval для s-выражения.

eval[(EQ (QUOTE A) (CAR (CONS (QUOTE A) (QUOTE (B C D)))));NIL]

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

Для ЛИСП [ править ]

MLisp был современным (1968–1973) проектом по реализации внешнего интерфейса Lisp, похожего на M-выражение. несколько дополнительных функций, таких как гигиенические макросы , сопоставление с образцом и возврат назад Было включено . В конечном итоге он превратился в заброшенный проект LISP70 . M-LISP ( MetaLISP ) 1989 года был еще одной попыткой объединить M-выражения со Scheme. [7]

Анализатор М-выражения « AI Memo 8» доступен в Common Lisp , но автор рассматривает его как аргумент против М-выражений из-за его предполагаемой неспособности справиться с макросами. [8]

Дальнейшее развитие [ править ]

CGOL MacLisp (1977) был реализован в . и преследует аналогичную цель - введение синтаксиса, подобного Алголу, с инфиксными операторами [7] Известно, что он работает над Armed Bear Common Lisp . [9]

Более поздний (около 2003 г.) вариант — это I-выражение , которое использует отступы для неявного обозначения круглых скобок и, таким образом, в некотором смысле является промежуточным между S-выражениями и M-выражениями. I-выражения были введены в Scheme Request For Implementation 49 как вспомогательный синтаксис для Scheme , но они не получили широкого распространения. [10]

Дальнейшее развитие — «милое» t-выражение , имеющее инфиксные операторы без приоритета. Как и I-выражения, t-выражения представляют собой всего лишь простое преобразование S-выражений, поэтому теоретически их можно использовать на любом диалекте Лиспа и не мешать таким функциям, как макросы. [11]

Дополнительные, связанные с синтаксисом, включают Dylan от Apple (токены типа Algol) и Clojure других литеральных синтаксисов. добавление [7]

Примечания [ править ]


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

  1. ^ «Реализация LISP» . www-formal.stanford.edu . Проверено 29 марта 2020 г.
  2. ^ Перейти обратно: а б с «Руководство программиста LISP 1.5» (PDF) . Community.computerhistory.org. 1965. Архивировано из оригинала (PDF) 11 февраля 2006 г. Проверено 2 сентября 2013 г.
  3. ^ Маккарти, Джон (апрель 1960 г.) «Рекурсивные функции символьных выражений и их машинное вычисление, часть I»
  4. ^ Маккарти, Джон (март 1959 г.). «Рекурсивные функции символьных выражений и их машинное вычисление (AI Memo 8)» .
  5. ^ «Реализация LISP» . Официальный сайт Stanford.edu. 12 февраля 1979 г. Проверено 24 августа 2013 г.
  6. ^ «Анатомия LISP» . МакГроу-Хилл, Инк. 1978.
  7. ^ Перейти обратно: а б с Ли, Ха. «Обзор синтаксиса инфиксов LISP» .
  8. ^ «Парсер M-выражений» . Давайте новичкам поиграем с ними и поймем, насколько они непрактичны. Обратите внимание, например, что мы больше не можем использовать макросы, поскольку их синтаксис должен быть известен анализатору M-выражений.
  9. ^ CGOL о ABCL Разработка блога о реализации Armed Bear Common Lisp .
  10. ^ Мёллер, Эгиль (2003). «SRFI 49: Синтаксис, чувствительный к отступам» . srfi.schemers.org .
  11. ^ Уилер, Д.А. (2013). «SRFI 110: Sweet-выражения (t-выражения)» . srfi.schemers.org .
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 25892c97f1566107e1e4eb7066799993__1716093060
URL1:https://arc.ask3.ru/arc/aa/25/93/25892c97f1566107e1e4eb7066799993.html
Заголовок, (Title) документа по адресу, URL1:
M-expression - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)