M-выражение

Поделись знанием:
Перейти к: навигация, поиск

M-выражения (или метавыражения) в программировании изначально предназначались для использования для записи функций на Лиспе. Данные, обрабатываемые при помощи M-выражений, записывались с использованием S-выражений. M-выражения использовались в первоначальном теоретическом языке, описанном в ранних статьях о Лиспе, однако, в первой работающей реализации Лиспа M-выражения кодировались S-выражениями, и транслятор M-выражений так и не был реализован.

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

Джон Маккарти[1], [www-formal.stanford.edu/jmc/history/lisp/lisp.html История Лиспа]





Историческая связь с S-выражениями

S-выражения представляют данные, составляемые из атомов и пар. Первоначально атом описывался, как символ в верхнем регистре, а пары ограничивались скобками. Было описано также сокращённая запись списков, хотя первоначально элементов списков разделялись запятыми, а не пробелами. Например запись (мы используем пробелы, а не запятые):

((A B) (C D) (E F))

представляет собой список из трех элементов, каждый из которых представляет собой список из двух символов.

М-выражение может также использовать имена операторов, метапеременные и списки аргументов. Имена операторов и метапеременных задавались в нижнем регистре, чтобы показать, что они не являются символами (данными). Списки аргументов ограничивались квадратными скобками, [] и их элементы отделялись точкой с запятой. Например:

car[cons[(A . B); x]]

представляет собой операцию из двух частей:

  • в первой части конструируется пара из структуры данных (A . B) и всех данные представленных метапеременной x;
  • во вторая части извлекает первый элемент сконструированной пары.

В первоначальном описании Лиспа, опубликованном Маккарти, где он представлен как теоретический универсальный язык, описана функция eval, которая принимает в качестве входных данных S-выражения, переводя их в форму М-выражений, а также выполняет программы в виде М-выражения, являющихся закодированными S-выражениями. Вот несколько примеров M-выражений и их перекодировки в S-выражения (опять же с использованием современных обозначениях списков):

{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 поняли, что реализация eval будет работать как полная реализация интерпретатора Лиспа использующего S-выражения.[2] Ручная компиляция функции eval оказалась в сравнении с ожидаемым многолетним построением компилятора очень простой задачей. Сообщество программистов, использующих S-выражения быстро развивалось. M-выражения были заброшены и не были никогда реализованы.

Современное использование M-выражений

Хотя для Лисп программистов и несвойственно придумывать альтернативные формы языка (один из немногих примеров — это MLISP), некоторые всё же используют M-выражения. Но такие диалекты теряют равнообразность S-выражений, считающуюся важным моментом для выразительности языка. В результате, практически во всех общепринятых диалектах Лиспа S-выражения остаются основным (или единственным) синтаксисом. В число исключений входит язык Logo, который можно рассматривать (с некоторой степенью вольности) как Лисп на основе M-выражений. Некоторые другие языки программирования, такие как Dylan и Ruby, многое позаимствовали у Лиспа, однако используют ALGOLоподобный синтаксис, отличающийся и от S-выражений, и от M-выражений.

Имеется также [www.informatimago.com/develop/lisp/small-cl-pgms/m-expression/ реализация интерпретатора M-LISP] на Common Lisp, также вычисляющая M-выражения.

Варианты

Синтаксис функционального языка ML (англ. Metalanguage, «метаязык»), подобен синтаксису M-выражений («метавыражений»), он так же основан на математической нотации. Однако, наличие в ML дополнительных концепций, таких как аннотации типов и регулярные выражения маскирует это сходство.

Синтаксис, подобный оригинальным M-выражениям использует язык системы Mathematica, списки в нём записываются с использованием скобок (можно использовать для них и нотацию M-выражений), а для записи функций используются M-выражения.

Недавней вариацией на эту тему стали I-выражения, в которых роль неявных скобок играют отступы (как в Python). Таким образом они представляют собой нечто среднее между S-выражениями и M-выражениями. В SRFI-запросе (англ.) № 49 такие I-выражения были предложены как дополнительный синтаксис для языка Scheme, но он не получил широкого распространения.

Напишите отзыв о статье "M-выражение"

Ссылки

  • [srfi.schemers.org/srfi-49/srfi-49.html Scheme Request For Implementation 49]

Примечания

  1. [www-formal.stanford.edu/jmc/history/lisp/node3.html The implementation of LISP]
  2. community.computerhistory.org/scc/projects/LISP/book/LISP%201.5%20Programmers%20Manual.pdf

Отрывок, характеризующий M-выражение

Пьер признался, что это была правда, и с этого вопроса, понемногу руководимый вопросами княжны Марьи и в особенности Наташи, вовлекся в подробный рассказ о своих похождениях.
Сначала он рассказывал с тем насмешливым, кротким взглядом, который он имел теперь на людей и в особенности на самого себя; но потом, когда он дошел до рассказа об ужасах и страданиях, которые он видел, он, сам того не замечая, увлекся и стал говорить с сдержанным волнением человека, в воспоминании переживающего сильные впечатления.
Княжна Марья с кроткой улыбкой смотрела то на Пьера, то на Наташу. Она во всем этом рассказе видела только Пьера и его доброту. Наташа, облокотившись на руку, с постоянно изменяющимся, вместе с рассказом, выражением лица, следила, ни на минуту не отрываясь, за Пьером, видимо, переживая с ним вместе то, что он рассказывал. Не только ее взгляд, но восклицания и короткие вопросы, которые она делала, показывали Пьеру, что из того, что он рассказывал, она понимала именно то, что он хотел передать. Видно было, что она понимала не только то, что он рассказывал, но и то, что он хотел бы и не мог выразить словами. Про эпизод свой с ребенком и женщиной, за защиту которых он был взят, Пьер рассказал таким образом:
– Это было ужасное зрелище, дети брошены, некоторые в огне… При мне вытащили ребенка… женщины, с которых стаскивали вещи, вырывали серьги…
Пьер покраснел и замялся.
– Тут приехал разъезд, и всех тех, которые не грабили, всех мужчин забрали. И меня.
– Вы, верно, не все рассказываете; вы, верно, сделали что нибудь… – сказала Наташа и помолчала, – хорошее.
Пьер продолжал рассказывать дальше. Когда он рассказывал про казнь, он хотел обойти страшные подробности; но Наташа требовала, чтобы он ничего не пропускал.
Пьер начал было рассказывать про Каратаева (он уже встал из за стола и ходил, Наташа следила за ним глазами) и остановился.
– Нет, вы не можете понять, чему я научился у этого безграмотного человека – дурачка.
– Нет, нет, говорите, – сказала Наташа. – Он где же?
– Его убили почти при мне. – И Пьер стал рассказывать последнее время их отступления, болезнь Каратаева (голос его дрожал беспрестанно) и его смерть.
Пьер рассказывал свои похождения так, как он никогда их еще не рассказывал никому, как он сам с собою никогда еще не вспоминал их. Он видел теперь как будто новое значение во всем том, что он пережил. Теперь, когда он рассказывал все это Наташе, он испытывал то редкое наслаждение, которое дают женщины, слушая мужчину, – не умные женщины, которые, слушая, стараются или запомнить, что им говорят, для того чтобы обогатить свой ум и при случае пересказать то же или приладить рассказываемое к своему и сообщить поскорее свои умные речи, выработанные в своем маленьком умственном хозяйстве; а то наслажденье, которое дают настоящие женщины, одаренные способностью выбирания и всасыванья в себя всего лучшего, что только есть в проявлениях мужчины. Наташа, сама не зная этого, была вся внимание: она не упускала ни слова, ни колебания голоса, ни взгляда, ни вздрагиванья мускула лица, ни жеста Пьера. Она на лету ловила еще не высказанное слово и прямо вносила в свое раскрытое сердце, угадывая тайный смысл всей душевной работы Пьера.
Княжна Марья понимала рассказ, сочувствовала ему, но она теперь видела другое, что поглощало все ее внимание; она видела возможность любви и счастия между Наташей и Пьером. И в первый раз пришедшая ей эта мысль наполняла ее душу радостию.
Было три часа ночи. Официанты с грустными и строгими лицами приходили переменять свечи, но никто не замечал их.
Пьер кончил свой рассказ. Наташа блестящими, оживленными глазами продолжала упорно и внимательно глядеть на Пьера, как будто желая понять еще то остальное, что он не высказал, может быть. Пьер в стыдливом и счастливом смущении изредка взглядывал на нее и придумывал, что бы сказать теперь, чтобы перевести разговор на другой предмет. Княжна Марья молчала. Никому в голову не приходило, что три часа ночи и что пора спать.
– Говорят: несчастия, страдания, – сказал Пьер. – Да ежели бы сейчас, сию минуту мне сказали: хочешь оставаться, чем ты был до плена, или сначала пережить все это? Ради бога, еще раз плен и лошадиное мясо. Мы думаем, как нас выкинет из привычной дорожки, что все пропало; а тут только начинается новое, хорошее. Пока есть жизнь, есть и счастье. Впереди много, много. Это я вам говорю, – сказал он, обращаясь к Наташе.
– Да, да, – сказала она, отвечая на совсем другое, – и я ничего бы не желала, как только пережить все сначала.
Пьер внимательно посмотрел на нее.
– Да, и больше ничего, – подтвердила Наташа.
– Неправда, неправда, – закричал Пьер. – Я не виноват, что я жив и хочу жить; и вы тоже.
Вдруг Наташа опустила голову на руки и заплакала.
– Что ты, Наташа? – сказала княжна Марья.
– Ничего, ничего. – Она улыбнулась сквозь слезы Пьеру. – Прощайте, пора спать.
Пьер встал и простился.

Княжна Марья и Наташа, как и всегда, сошлись в спальне. Они поговорили о том, что рассказывал Пьер. Княжна Марья не говорила своего мнения о Пьере. Наташа тоже не говорила о нем.
– Ну, прощай, Мари, – сказала Наташа. – Знаешь, я часто боюсь, что мы не говорим о нем (князе Андрее), как будто мы боимся унизить наше чувство, и забываем.