М-выражение - M-expression

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

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

Фон

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

Пример M-выражения (LISP 1.5, 1965)[2]
Тип выраженияМатематические обозначенияМ-выражениеСовременное S-выражение Лиспа
Значение списка[1;2;3](Цитировать (1 2 3))
Приложение функцииf [x; y](ж Икс у)
Определение функцииметка [квадрат; λ [[x]; раз [x; x]]](определять квадрат (лямбда (Икс) (* Икс Икс)))
Условное выражение[lessp [x; 0] → минус [x]; Т → х](cond ((< Икс 0) (- Икс)) (т Икс))

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

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

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

Реализации

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

Пример фрагментов кода Wolfram
Тип выраженияСинтаксис с сахаром (InputForm)Функциональная форма (FullForm)
Значение списка{1,2,3}Список[1,2,3]
Приложение функцииж[Икс,у]ж[Икс,у]
Определение функции
  • ж:=#^2& (чистый)
  • ж[Икс_]:=Икс^2 (шаблон)
  • SetDelayed[ж,Функция[Икс,Мощность[Икс,2]]] (чистый)
  • SetDelayed[fPattern[Икс,Пустой[]]],Мощность[Икс,2]] (шаблон)

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

Для LISP

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

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

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

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

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

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

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

Рекомендации

  1. ^ «Внедрение LISP». www-formal.stanford.edu. Получено 2020-03-29.
  2. ^ а б c "Руководство программиста LISP 1.5" (PDF). Community.computerhistory.org. 1965. Архивировано с оригинал (PDF) на 2006-02-11. Получено 2013-09-02.
  3. ^ Маккарти, Джон (апрель 1960) "Рекурсивные функции символьных выражений и их вычисление машиной, часть I"
  4. ^ Маккарти, Джон (март 1959). «Рекурсивные функции символьных выражений и их машинное вычисление (AI Memo 8)».
  5. ^ «Внедрение LISP». Formal.stanford.edu. 1979-02-12. Получено 2013-08-24.
  6. ^ Mathematica как язык перезаписи.
  7. ^ а б c Ли, Ха. "Обзор синтаксиса LISP Infix".
  8. ^ «Парсер для M-выражений». Давайте новичкам поиграться с ними и поймем, насколько они непрактичны. Обратите внимание, например, что мы больше не можем использовать макросы, потому что их синтаксис должен быть известен парсеру M-выражений.
  9. ^ CGOL на ABCL Разработка реализации Common Lisp Armed Bear блог.
  10. ^ Мёллер, Эгиль (2003). «SRFI 49: синтаксис с учетом отступа». srfi.schemers.org.
  11. ^ Уиллер, Д.А. (2013). "SRFI 110: Сладкие выражения (t-выражения)". srfi.schemers.org.