Jak daleko může LISP maker jít?

hlasů
43

Četl jsem hodně že LISP může předefinovat syntaxe v reálném čase, pravděpodobně s makry. Jsem zvědavý, jak daleko to vlastně jít? Můžete předefinovat jazykovou strukturu natolik, že hranice se stává překladač pro jiný jazyk? Například byste mohli změnit funkčního charakteru LISP do více objektově orientované syntaxe a sémantiky, třeba říci, které mají syntaxi blíže k něčemu jako Ruby?

Zejména je možné zbavit závorce pekla pomocí makra? Naučil jsem se dost (Emacs-) LISP přizpůsobit Emacs s mými vlastními stopových prvků, ale jsem velmi zvědavý, jak daleko makra může jít na přizpůsobení jazyka.

Položena 05/08/2008 v 08:32
zdroj uživatelem
V jiných jazycích...                            


14 odpovědí

hlasů
33

To je opravdu dobrá otázka.

Myslím, že je nuancí, ale rozhodně zodpovědný:

Makra nejsou uvízl v S-výrazy. Viz LOOP makro velmi složitý jazyk psaný pomocí klíčových slov (symbolů). Takže, když budete začínat a končit smyčku se závorkami, uvnitř má vlastní syntaxi.

Příklad:

(loop for x from 0 below 100
      when (even x)
      collect x)

Jak již bylo řečeno, většina jednoduchých makra stačí použít S-výrazy. A vy byste se „zasekl“ jejich použití.

Ale s-výrazy, jako Sergio odpověděl, začnou cítit. Syntaxe dostane z cesty a začnete kódování v syntaktického stromu.

Pokud jde o čtenáře maker, ano, mohli byste si představit, napsat něco takového:

#R{
      ruby.code.goes.here
  }

Ale vy byste třeba napsat vlastní Ruby syntax parser.

Můžete také napodobit některé Ruby konstruktů, jako jsou bloky, s makry, které sestavují ke stávajícím Lisp konstrukty.

#B(some lisp (code goes here))

by se přeložit do

(lambda () (some lisp (code goes here)))

Viz tuto stránku pro to, jak to udělat.

Odpovězeno 15/09/2008 v 16:07
zdroj uživatelem

hlasů
20

Ano, můžete předefinovat syntaxi, takže Lisp stává kompilátor. Ty to pomocí „Reader makra“, které se liší od běžného „kompilátoru maker“, které jste pravděpodobně uvažujete o.

Common Lisp má vestavěný zařízení definovat novou syntaxi pro čtenáře a čtenář maker zpracovat tuto syntaxi. Toto zpracování se provádí při čtení čase (který přichází před kompilaci nebo eval času). Chcete-li se dozvědět více o definování čtenáře makra v Common Lisp, viz Common Lisp Hyperspec - budete chtít přečíst Ch. 2, "Syntaxe" a Ch. 23, "Reader" . (Věřím, že schéma má stejné zařízení, ale nejsem tak obeznámeni s ním - viz zdroje Scheme pro programovací jazyk Arc ).

Jako jednoduchý příklad, řekněme, že chcete Lisp používat složené závorky namísto závorky. K tomu je zapotřebí něco jako následující definice čtenáře:

;; { and } become list delimiters, along with ( and ).
(set-syntax-from-char #\{ #\( )
(defun lcurly-brace-reader (stream inchar) ; this was way too easy to do.
  (declare (ignore inchar))
  (read-delimited-list #\} stream t))
(set-macro-character #\{ #'lcurly-brace-reader)

(set-macro-character #\} (get-macro-character #\) ))
(set-syntax-from-char #\} #\) )

;; un-lisp -- make parens meaningless
(set-syntax-from-char #\) #\] ) ; ( and ) become normal braces
(set-syntax-from-char #\( #\[ )

Říkáte Lisp, že {je jako (a že} je jako a). Pak můžete vytvořit funkci ( lcurly-brace-reader), že čtenář bude volat, kdykoli to uzná a {a použijte set-macro-characterpřiřadit tuto funkci v {. Pak budete říkat Lisp, že (i) jsou jako [a] (to znamená, že nemá smysl syntax).

Jiné věci, které by mohly dělat patří například vytvoření nové syntaxe řetězce nebo pomocí [a] přiložit in-fix notaci a zpracovat ji do S-výrazy.

Můžete také jít daleko nad rámec toho, obnovovat celou syntaxi se svými vlastními makro znaky, které spustí opatření v čtečce, takže obloha je opravdu limit. To je jen jeden z důvodů, proč Paul Graham a další stále říkají, že Lisp je dobrý jazyk, v němž se psát kompilátor.

Odpovězeno 16/09/2008 v 20:28
zdroj uživatelem

hlasů
16

Nejsem expert Lisp, sakra nejsem ani Lisp programátor, ale po troše experimentování s jazykem jsem došel k závěru, že po nějaké době spuštění závorka stává ‚neviditelné‘ a začnete vidět kód jako chcete, aby to bylo. Začnete věnovat větší pozornost syntaktických konstrukcí, které vytvoříte pomocí S-exprs a makra, a méně na lexikální formě textu seznamů a závorkách.

To je zvláště pravda, pokud budete mít výhodu dobrého editor, který pomáhá s odsazení a syntaxe zbarvení (zkuste nastavit závorky na barvy velmi podobné pozadí).

V některých případech nemusí být schopen zcela nahradit jazyk a získat syntaxe ‚Ruby‘, ale nemusíte ji. Díky jazykové flexibility byste mohli skončit s dialektem, který se cítí, jako byste se v návaznosti na ‚Ruby styl programování‘, pokud chcete, co to bude znamenat pro vás.

Vím, že je to jen empirické pozorování, ale myslím, že jsem jeden z těch Lisp osvícení chvíle, kdy jsem si to uvědomil.

Odpovězeno 26/08/2008 v 10:49
zdroj uživatelem

hlasů
15

Znovu a znovu, nováčci Lisp chtějí „zbavit všech závorce.“ To trvá několik týdnů. Žádný projekt na vybudování vážné programování syntaxe pro všeobecné použití na vrcholu obvyklého S-výrazu analyzátor někdy dostane kamkoliv, protože programátoři vždy skončit přednost, co v současné době vnímají jako „závorka peklo.“ To trvá trochu zvyknout, ale ne moc! Poté, co si na to zvyknout, a můžete skutečně ocenit plasticitu výchozí syntaxe, se vrací do jazyků, kde je jen jeden způsob, jak vyjádřit žádnou konkrétní programové konstrukce je opravdu mřížka.

Jak již bylo řečeno, Lisp je vynikající substrát pro budování doménově specifický jazyk. Stejně dobré, ne-li lepší, než, XML.

Hodně štěstí!

Odpovězeno 16/09/2008 v 20:29
zdroj uživatelem

hlasů
12

Nejlepší vysvětlení Lisp makra, které jsem kdy viděl, je na

https://www.youtube.com/watch?v=4NO83wZVT0A

začíná na asi 55 minut. To je video o přednášce Peter Seibel, autor „Practical Common Lisp“, což je nejlepší Lisp učebnice neexistuje.

Motivací pro Lisp makra je obvykle těžké vysvětlit, protože opravdu přijdou na své v situacích, které jsou příliš dlouhé, aby v jednoduchý návod. Peter přichází s velkým příkladem; jej můžete snadno uchopit úplně, a to je dobré, správné používání Lisp makra.

Ptal ses: „může změnit funkčního charakteru LISP do více objektově orientované syntaxe a sémantiky“. Odpověď je ano. Ve skutečnosti, Lisp původně neměl objektově orientované programování vůbec, není překvapivé, protože Lisp byl asi od cesty před objektově orientovaného programování! Ale když jsme se poprvé dozvěděli o OOP v roce 1978, jsme byli schopni přidat snadno Lisp, s použitím, mimo jiné, makra. Nakonec byl vyvinut Common Lisp Object System (CLOS), velmi silný objektově orientovaný programovací systém, který se hodí do elegantně Lisp. Celá věc může být naloženo jako rozšíření - nic je postavena-in! To vše je hotovo s makry.

Lisp má zcela jinou funkci, s názvem „čtečky maker“, která může být použita k prodloužení povrchové syntaxe jazyka. Pomocí čtečky makra, můžete sublanguages, které mají C-like nebo Ruby syntaxe podobné. Transformují text do Lisp, vnitřně. Ty nejsou široce používány ve většině reálných Lisp programátorů, a to především proto, že je obtížné rozšířit interaktivní vývojové prostředí pochopit novou syntaxi. Například příkazy Emacs odsazení by být zaměňována novou syntaxi. Pokud jste aktivní, když Emacs je rozšiřitelný příliš, a vy mohl učit o svém novém lexikální syntaxi.

Odpovězeno 05/10/2008 v 16:03
zdroj uživatelem

hlasů
11

Pravidelné makra pracují na seznamech objektů. Nejčastěji jsou tyto objekty jiné listiny (tedy tvořit stromy) a symboly, ale mohou být i jiné předměty, jako jsou řetězce, hashtables, uživatelem definované objekty apod Tyto struktury se nazývají S-EXPS .

Takže, když jste vložili zdrojový soubor, váš Lisp kompilátor bude analyzovat text a vyrábět s-EXPS. Makra pracovat na nich. To funguje skvěle a je to úžasný způsob, jak rozšířit jazyk v duchu S-EXPS.

Navíc výše uvedené analýze proces lze rozšířit pomocí „Čtenář maker“, které umožňují přizpůsobit způsob, jakým kompilátor změní text do s-EXPS. Navrhuji však, že jste přijali syntaxi LISPu namísto ohnutím do něčeho jiného.

Mluvíš trochu zmatená, když jste zmínil LISP je „funkční povahu“ a Ruby „objektově orientované syntaxe“. Nejsem si jistý, co „objektově orientované syntaxe“ má být, ale Lisp je jazyk multi-paradigma a podporuje objektově orientované programování extremelly dobře.

BTW, když řeknu, Lisp, myslím Common Lisp .

Navrhuji vám dát své předsudky pryč a dát Lisp upřímný jít .

Odpovězeno 26/08/2008 v 10:36
zdroj uživatelem

hlasů
9

To, co žádáte, je něco jako se ptát, jak se stát expertem čokolády, takže můžete odstranit všechen ten pekelný hnědou látku ze svého oblíbeného čokoládového dortu.

Odpovězeno 17/09/2008 v 13:14
zdroj uživatelem

hlasů
9

Závorka peklo? Nevidím žádný další závorka in:

(function toto)

než v roce:

function(toto);

a

(if tata (toto)
  (titi)
  (tutu))

ne více než v roce:

if (tata)
  toto();
else
{
  titi();
  tutu();
}

Vidím méně držáků a ‚;‘ ačkoli.

Odpovězeno 16/09/2008 v 17:23
zdroj uživatelem

hlasů
6

Ano, můžete zásadně změnit syntaxi, a dokonce uniknout „závorky peklo“. K tomu budete muset definovat novou syntaxi čtečky. Podívejte se do čtečky maker.

Mám podezření se však, že k dosažení úrovně Lisp odbornosti programovat takto maker, budete muset ponořit do jazyku do takové míry, že již nebude zvažovat Parenthese „peklo“. Tedy v době, kdy víte, jak se jim vyhnout, budete přišli přijmout je za dobrou věc.

Odpovězeno 15/09/2008 v 13:07
zdroj uživatelem

hlasů
2

viz tento příklad toho, jak čtenář makra lze rozšířit Lisp čtenáři komplexní úlohy, jako je XML templating:

http://common-lisp.net/project/cl-quasi-quote/present-class.html

Tento uživatel knihovny kompiluje statické části XML do kódování UTF-8 doslovný bytovými poli v době kompilace, které jsou připraveny k zápisu sequence'd do síťového proudu. a jsou použitelné v běžných lisp maker, které jsou kolmé ... umístění znakových vlivů čárkami, které části jsou konstantní a které by měly být hodnoceny v době běhu.

Další podrobnosti jsou k dispozici na: http://common-lisp.net/project/cl-quasi-quote/

Dalším projektem, který pro Common Lisp rozšíření syntaxe: http://common-lisp.net/project/cl-syntax-sugar/

Odpovězeno 17/09/2008 v 01:30
zdroj uživatelem

hlasů
2

Pokud se chcete lisp vypadat jako Ruby používat Ruby.

Je možné používat Ruby (a Python) ve velmi Lisp jako způsob, který je jedním z hlavních důvodů, proč jsme získali souhlas tak rychle.

Odpovězeno 05/08/2008 v 08:40
zdroj uživatelem

hlasů
1

Jedním z použití makra, které mi vyrazil dech bylo ověření kompilace-time žádostí SQL proti DB.

Jakmile si uvědomíte, že máte plnou jazykem po ruce při kompilaci, otevírá nové zajímavé perspektivy. Což také znamená, že můžete střílet do nohy v zajímavých nových způsobů (jako je zobrazování kompilace není reprodukovatelné, což může velmi snadno proměnit v noční můru ladění).

Odpovězeno 19/09/2008 v 11:43
zdroj uživatelem

hlasů
1

To je záludná otázka. Vzhledem k tomu, lisp je již konstrukčně tak blízko derivační strom rozdíl mezi velkým počtem maker a provádění své vlastní mini-jazyk generátor analyzátoru, není zcela jasné. Ale kromě otevírací a zavírací závorka, byste mohli snadno skončit s něčím, co vypadá jako nic jako Lisp.

Odpovězeno 06/08/2008 v 13:14
zdroj uživatelem

hlasů
1

@sparkes

Někdy LISP je jasná volba jazyka, a to Emacs rozšíření. Jsem si jistý, že bych mohl použít Ruby rozšířit Emacs kdybych chtěl, ale Emacs byl navržen tak, aby být rozšířen LISP, takže se zdá, že smysl jej použít v této situaci.

Odpovězeno 05/08/2008 v 08:45
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more