M-výrazy (nebo meta -výrazy ) v programování měly být původně použity k zápisu funkcí v Lisp . Data zpracovaná pomocí M-výrazů byla zapsána pomocí S-výrazů . M-výrazy byly použity v původním teoretickém jazyce popsaném v raných Lisp dokumentech, nicméně v první pracovní implementaci Lisp byly M-výrazy zakódovány jako S-výrazy a překladač M-výrazů nebyl nikdy implementován.
Projekt přesného definování M-výrazů a jejich kompilace, nebo alespoň jejich překladu do S-výrazů, nebyl nikdy dokončen ani explicitně opuštěn. Jednoduše byl odložen na neurčito a nová generace programátorů zjistila, že dávají přednost internímu zápisu před jakýmkoli programovým zápisem ve stylu FORTRAN nebo ALGOL, který je napadne.
Původní text (anglicky)[ zobrazitskrýt]Projekt precizního definování M-výrazů a jejich sestavení nebo alespoň převedení do S-výrazů nebyl ani dokončen, ani explicitně opuštěn. Prostě to ustoupilo do neurčité budoucnosti a objevila se nová generace programátorů, kteří dali přednost internímu zápisu před jakýmkoli zápisem podobným FORTRANu nebo ALGOLu, který bylo možné vymyslet.
— John McCarthy [1] , Historie LispS-výrazy jsou data tvořená pouze atomy a páry . Zpočátku byl atom popisován jako velké písmeno a dvojice byly ohraničeny závorkami. Byl také popsán zkrácený zápis pro seznamy , ačkoli zpočátku byly prvky seznamů odděleny čárkami, nikoli mezerami . Příklad záznamu (používáme mezery, nikoli čárky):
((A B C D E F))je seznam tří prvků, z nichž každý je seznam dvou znaků.
M-výraz může také používat názvy operátorů, metaproměnné a seznamy argumentů. Názvy operátorů a metaproměnných byly uvedeny malými písmeny, aby bylo zřejmé, že se nejedná o symboly (data). Seznamy argumentů byly odděleny hranatými závorkami []a jejich prvky byly odděleny středníky. Například:
auto[nevýhody[(A . B); X]]je dvoudílná operace:
Původní popis Lispu publikovaný McCarthym, kde je prezentován jako teoretický univerzální jazyk, popisuje funkci eval, která přijímá jako vstupní S-výrazy, převádí je do formy M-výrazů a také spouští programy ve formě M- výrazy, které jsou zakódovány S -výrazy. Zde je několik příkladů M-výrazů a jejich převodu na S-výrazy (opět pomocí moderního zápisu seznamu):
Původní implementace Lispu byla plánována jako velmi dlouhý proces, protože kompilátorům v té době trvalo roky psaní. Implementace začala ruční kompilací určitých funkcí, zatímco podjazyk M-výrazů byl ještě předběžný. Steve Russell a Daniel J. Edwards si však uvědomili, že implementace evalbude fungovat jako plná implementace interpretu Lisp pomocí S-výrazů. [2] Ruční kompilace funkce evalse ukázala jako velmi jednoduchý úkol ve srovnání s roky očekávaným budováním kompilátoru. Komunita programátorů používajících S-expressions se rychle rozrostla. M-výrazy byly opuštěny a nedostaly společnou implementaci pro celou rodinu jazyků Lisp.
I když je neobvyklé, že programátoři Lisp přicházejí s alternativními formami jazyka ( MLISP je jedním z mála příkladů ), někteří používají M-výrazy. Ale takové dialekty ztrácejí jednotnost S-výrazů, což je považováno za důležitý bod pro expresivitu jazyka. Výsledkem je, že S-výrazy zůstávají primární (nebo jedinou) syntaxí prakticky ve všech běžných dialektech Lisp. Mezi výjimky patří jazyk Logo , který lze (s určitou svobodou) považovat za Lisp založený na M-výrazech. Některé další programovací jazyky, jako je Dylan a Ruby , si hodně půjčují od Lisp, ale používají syntaxi podobnou ALGOL , která se liší jak od S-výrazů, tak od M-výrazů.
Existuje také implementace Common Lisp interpretu M-LISP , který také vyhodnocuje M-výrazy.
Syntaxe funkcionálního jazyka ML ( anglicky Metalanguage , "metalanguage" ) je podobná syntaxi M-výrazů ( "metaexpressions" ), je rovněž založena na matematickém zápisu. Přítomnost dalších pojmů v ML, jako jsou typové anotace a regulární výrazy, však tuto podobnost maskuje.
Syntaxe, podobně jako původní M-výrazy, používá jazyk systému Mathematica , seznamy v něm jsou zapisovány pomocí závorek (lze pro ně použít i zápis M-výrazů) a M-výrazy se používají k zápisu funkcí.
Nedávnou variací na toto téma jsou I-výrazy , ve kterých odsazení hraje roli implicitních závorek (jako v Pythonu ). Jedná se tedy o křížence mezi S-výrazy a M-výrazy. V dotazu SRFI takové I-výrazy navrženy jako další syntaxe pro jazyk Scheme ale nebyly široce přijaty.
Lisp | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Charakteristika |
| ||||||||||||||
Implementace |
| ||||||||||||||
Hardware |
| ||||||||||||||
Společenství |
| ||||||||||||||
|