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

В компьютерном программировании , M-выражение (или мета-выражение ) было предложено в начале синтаксис языка программирования Lisp , вдохновленный современными языками , такие как Fortran и Алгол . Нотация никогда не была реализована в языке и, как таковая, никогда не была доработана. [1]

По сравнению с S-выражениями , M-выражения вводят обозначения функций , инфиксные операторы (включая defunоператор) и сокращения для condи listв язык. [2]

Фон [ править ]

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

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

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

Проект точного определения M-выражений и их компиляции или, по крайней мере, перевода их в S-выражения не был ни завершен, ни явным образом отвергнут. Он просто отошел в неопределенное будущее, и появилось новое поколение программистов, которые предпочли внутреннюю нотацию любой нотации, подобной ФОРТРАНУ или Алголу, которую можно было придумать. [5]

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

Форма засахаренных M-выражения реализована в Wolfram языке в Wolfram Mathematica с 1988 года:

(Для объяснения условных операторов требуется больше, поскольку общая условная система в языке основана на сопоставлении с образцом и перезаписи .) [6]

Для LISP [ править ]

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

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

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

CGOL (1977) был реализован в Maclisp и следует той же цели введения Алгол-подобный синтаксис с операторами инфиксные. [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. ^ a b c "Руководство программиста LISP 1.5" (PDF) . Community.computerhistory.org. 1965. Архивировано из оригинального (PDF) 11 февраля 2006 года . Проверено 2 сентября 2013 .
  3. ^ Маккарти, Джон (апрель 1960) "Рекурсивные функции символьных выражений и их вычисление машиной, часть I"
  4. ^ Маккарти, Джон (март 1959). «Рекурсивные функции символьных выражений и их машинное вычисление (AI Memo 8)» .
  5. ^ «Реализация LISP» . Formal.stanford.edu. 1979-02-12 . Проверено 24 августа 2013 .
  6. ^ Mathematica как язык перезаписи .
  7. ^ a b c Ли, Ха. «Обзор синтаксиса LISP Infix» .
  8. ^ «Парсер для M-выражений» . Давайте новичкам поиграться с ними и поймем, насколько они непрактичны. Обратите внимание, например, что мы больше не можем использовать макросы, потому что их синтаксис должен быть известен парсеру M-выражений.
  9. ^ CGOL на ABCL Разработка блога реализации Armed Bear Common Lisp .
  10. Перейти ↑ Möller, Egil (2003). «SRFI 49: синтаксис с учетом отступов» . srfi.schemers.org .
  11. ^ Уиллер, DA (2013). «SRFI 110: Сладкие выражения (t-выражения)» . srfi.schemers.org .