M-выражениеM-выраже́ния (или ме́тавыраже́ния) в программировании изначально предполагалось использовать для записи функций на Лиспе. Данные, обрабатываемые при помощи M-выражений, записывались с использованием S-выражений. M-выражения использовались в первоначальном теоретическом языке, описанном в ранних статьях о Лиспе, однако, в первой работающей реализации Лиспа M-выражения кодировались S-выражениями, и транслятор M-выражений так и не был реализован.
Историческая связь с S-выражениямиS-выражения представляют собой данные, составляемые только из атомов и пар. Первоначально атом описывался, как символ в верхнем регистре, а пары ограничивались скобками. Была описана также сокращённая запись списков, хотя первоначально элементы списков разделялись в ней запятыми, а не пробелами. Например запись (мы используем пробелы, а не запятые): ((A B) (C D) (E F)) представляет собой список из трёх элементов, каждый из которых представляет собой список из двух символов. М-выражение может также использовать имена операторов, метапеременные и списки аргументов. Имена операторов и метапеременных задавались в нижнем регистре, чтобы показать, что они не являются символами (данными). Списки аргументов ограничивались квадратными скобками, car[cons[(A . B); x]] представляет собой операцию из двух частей:
В первоначальном описании Лиспа, опубликованном Маккарти, где он представлен как теоретический универсальный язык, описана функция
{M-выражения} {S-выражения} (A B C) (QUOTE (A B C)) car[x] (CAR X) car[append[(A B C); (D E F)]] (CAR (APPEND (QUOTE (A B C)) (QUOTE (D E F)))) Первоначальная реализация Лиспа планировалась как очень долгий процесс, так как в то время компиляторы писались годами. Реализация началась с ручной компиляции определённых функций, в то время как подъязык М-выражений носил ещё предварительный характер. Однако Стив Рассел[англ.] и Daniel J. Edwards поняли, что реализация Современное использование M-выраженийХотя для Лисп программистов и несвойственно придумывать альтернативные формы языка (один из немногих примеров — это MLISP), некоторые всё же используют M-выражения. Но такие диалекты теряют равнообразность S-выражений, считающуюся важным моментом для выразительности языка. В результате, практически во всех общепринятых диалектах Лиспа S-выражения остаются основным (или единственным) синтаксисом. В число исключений входит язык Logo, который можно рассматривать (с некоторой степенью вольности) как Лисп на основе M-выражений. Некоторые другие языки программирования, такие как Dylan и Ruby, многое позаимствовали у Лиспа, однако используют ALGOLоподобный синтаксис, отличающийся и от S-выражений, и от M-выражений. Имеется также реализация интерпретатора M-LISP на Common Lisp, также вычисляющая M-выражения. ВариантыСинтаксис функционального языка ML (англ. Metalanguage, «метаязык»), подобен синтаксису M-выражений («метавыражений»), он так же основан на математической нотации. Однако, наличие в ML дополнительных концепций, таких как аннотации типов и регулярные выражения маскирует это сходство. Синтаксис, подобный оригинальным M-выражениям использует язык системы Mathematica, списки в нём записываются с использованием скобок (можно использовать для них и нотацию M-выражений), а для записи функций используются M-выражения. Недавней вариацией на эту тему стали I-выражения, в которых роль неявных скобок играют отступы (как в Python). Таким образом они представляют собой нечто среднее между S-выражениями и M-выражениями. В SRFI-запросе[англ.] № 49 такие I-выражения были предложены как дополнительный синтаксис для языка Scheme, но он не получил широкого распространения. СсылкиПримечания
|
Portal di Ensiklopedia Dunia