Meddig lehet LISP makrók menni?

szavazat
43

Elolvastam egy csomó, LISP újradefiniálhatja szintaxis on the fly, feltehetően makrók. Kíváncsi vagyok, milyen messze ez ténylegesen megy? Tud újra a nyelvi szerkezet annyira, hogy borderline válik fordítóprogramot másik nyelven? Például, meg tudná változtatni a funkcionális jellegét LISP egy sokkal objektumorientált szintaktikai és szemantikai, talán mondani, amelynek szintaxisa közelebb valami, mint a Ruby?

Különösen, ez lehet megszabadulni a zárójelben fene makrók segítségével? Megtanultam elég (Emacs-) LISP szabni Emacs a saját mikro-funkciók, de nagyon kíváncsi vagyok, hogy meddig mehet makrók testre a nyelvet.

A kérdést 05/08/2008 08:32
a forrás felhasználó
Más nyelveken...                            


14 válasz

szavazat
33

Ez egy nagyon jó kérdés.

Azt hiszem, ez árnyalt, de határozottan felelni:

Makró nem ragadt s-kifejezéseket. Lásd a LOOP makrót egy nagyon bonyolult nyelv segítségével írják kulcsszavak (szimbólumok). Tehát, bár lehet kezdete és vége a hurok zárójelben, benne saját szintaxist.

Példa:

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

Ennek ellenére, a legtöbb egyszerű makrók csak használja s-kifejezéseket. És akkor lenne „beragadt” használja őket.

De s-kifejezések, mint például Sergio megválaszolta, kezdi érezni jobbra. A szintaxis kap az útból, és elkezdi kódolás a szintaxis fát.

Ami olvasó makrók, igen, akkor elképzelhető, írj valamit, mint ez:

#R{
      ruby.code.goes.here
  }

De meg kéne írni a saját Ruby szintaxis elemző.

Azt is utánozzák néhány Ruby konstrukciók, mint a blokk, makrók, hogy összeállítja a meglévő Lisp konstrukciókat.

#B(some lisp (code goes here))

azt jelentené, hogy

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

Lásd ezt az oldalt , hogy hogyan kell csinálni.

Válaszolt 15/09/2008 16:07
a forrás felhasználó

szavazat
20

Igen, akkor újra a szintaxis, hogy Lisp válik fordító. Ugye ez a „Reader makrók”, ​​amely eltér a normál „Compiler makrók”, ​​hogy akkor valószínűleg gondolt.

Common Lisp van a beépített lehetőség, hogy meghatározzák az új szintaxist és az olvasó olvasó makrók feldolgozni a szintaxis. Ez a feldolgozás kelt olvasható időt (ami előtt összeállítja vagy eval idő). Ha szeretne többet megtudni meghatározó olvasó makrók Common Lisp, hogy a Common Lisp Hyperspec - szeretne olvasni Ch. 2. „Syntax” és Ch. 23 "Reader" . (Azt hiszem rendszer ugyanaz lehetőség, de nem vagyok annyira ismerős vele - lásd a rendszer forrásai az Arc programozási nyelv ).

Egy egyszerű példa, tegyük fel szeretné használni Lisp kapcsos zárójelek helyett zárójelben. Ez megköveteli valami hasonlót olvasó meghatározások:

;; { 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 #\( #\[ )

Azt mondod, hogy a Lisp {olyan, mint egy (és hogy a} olyan, mint egy). Akkor hozzon létre egy függvényt ( lcurly-brace-reader), hogy az olvasó fogja hívni, ha azt látja, a {és használja set-macro-characterrendelni ezt a funkciót az {. Akkor mondd Lisp, hogy (és) olyan, mint [és] (azaz nem értelmes szintaxis).

Más dolog, amit tehetett közé tartozik például, ami egy új karakterlánc szintaxis vagy a [és] csatolniuk a-fix jelöléssel és feldolgozni az S-kifejezések.

Azt is messze túlmutatnak ezen, újradefiniálja a teljes szintaxis saját makró karakterek, amelyek kiváltják intézkedéseket az olvasó, így az ég valóban a határ. Ez csak az egyik oka annak, hogy Paul Graham és mások mondogatom, hogy Lisp egy jó nyelv, amelyben levelet fordító.

Válaszolt 16/09/2008 20:28
a forrás felhasználó

szavazat
16

Nem vagyok egy Lisp szakértő, fene nem is vagyok egy Lisp programozó, de miután egy kicsit kísérletezni a nyelv I arra a következtetésre jutott, hogy egy idő után a zárójeles elkezdenek „láthatatlan” és elkezdi látni a kódot azt szeretné, hogy legyen. Elkezdesz nagyobb figyelmet kell fordítani a szintaktikai konstrukciók létrehozása révén s-exprs és makrók, és kevésbé a lexikális formája a szöveg listák és a zárójel.

Ez különösen igaz akkor, ha kihasználják a jó szerkesztő, amelynek segítségével a behúzás és szintaxis (próbáld meg a zárójelben egy nagyon hasonló szín a háttérben).

Lehet, hogy nem tudja helyettesíteni a nyelvet teljesen, és kap „Ruby” szintaxist, de nincs rá szükség. Hála a nyelvi rugalmasság is a végén, amelynek nyelvjárás, hogy úgy érzi, mint hogy követi a „Ruby stílus programozás”, ha azt szeretné, bármit is jelentene az Ön számára.

Tudom, hogy ez csak egy empirikus megfigyelés, de azt hiszem, volt egy olyan Lisp megvilágosodás pillanatok, amikor rájöttem, hogy ez.

Válaszolt 26/08/2008 10:49
a forrás felhasználó

szavazat
15

Újra és újra, újonnan Lisp akar „megszabadulni a zárójel.” Ez tart egy pár hétig. Nincs projekt építeni egy súlyos általános célú programozási szintaxis a tetején a szokásos S-kifejezést értelmező sem kap sehol, mert a programozók mindig zárja le inkább, amit jelenleg érzékelnek „zárójel pokolba.” Beletelik egy kicsit szokni kell, de nem sokat! Ha nem lehet szokni, és akkor igazán értékelni a plaszticitás az alapértelmezett szintaxis, megy vissza a nyelv, ahol már csak egy módja annak, hogy kifejezze egy adott programozási konstrukciót valóban rács.

Ennek ellenére, Lisp kitűnő szubsztrátja építési szakterület-specifikus nyelv. Ugyanolyan jó, ha nem jobb, mint az XML.

Sok szerencsét!

Válaszolt 16/09/2008 20:29
a forrás felhasználó

szavazat
12

A legjobb magyarázat Lisp makrók, amit valaha láttam van

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

kezdődően körülbelül 55 perc alatt. Ez a videó egy beszélgetés által adott Peter Seibel, a szerző a „Gyakorlati Common Lisp”, amely a legjobb Lisp tankönyv van.

A motiváció Lisp makrók általában nehéz megmagyarázni, mert tényleg jönnek a saját helyzetekben, amelyek túl hosszú ahhoz, hogy bemutassa egy egyszerű tutorial. Peter jön egy nagyszerű példa; akkor értik meg teljesen, és ez teszi a jó, helyes használata Lisp makrók.

Azt kérdezte: „tudná változtatni a funkcionális jellegét LISP egy sokkal objektumorientált szintaktikai és szemantikai”. A válasz igen. Tény, hogy a Lisp eredetileg nem volt objektumorientált programozás egyáltalán nem meglepő, hiszen a Lisp óta körül utat, mielőtt az objektum-orientált programozás! De amikor először értesült OOP 1978, tudtuk, hogy add meg Lisp könnyen segítségével, többek között, a makrók. Végül a Common Lisp Object System (CLOS) jött létre, egy nagyon erős objektumorientált programozási rendszer, amely elegánsan illeszkedik Lisp. Az egész dolog lehet betölteni, mint egy kiterjesztése - semmi nem beépített! Ez minden kész makrók.

Lisp egy teljesen más funkció, az úgynevezett „olvasó makrók”, ​​hogy lehet használni, hogy kiterjesszék a felszínén szintaxis a nyelvet. A Reader makrók, akkor lehet, hogy alnyelvet amelyek a C-szerű vagy Ruby-szerű szintaxis. Ezek alakítják át a szöveget Lisp, belsőleg. Ezek nem széles körben használják a legtöbb valódi Lisp-programozók, elsősorban azért, mert nehéz kiterjeszteni az interaktív fejlesztői környezet, hogy megértsék az új szintaxist. Például Emacs behúzás parancsokat lenne összekeverni egy új szintaxis. Ha energikus, bár Emacs bővíthető is, és akkor is megtanítani, az új lexikai szintaxis.

Válaszolt 05/10/2008 16:03
a forrás felhasználó

szavazat
11

Rendszeres makrók működnek objektumok listájának. Leggyakrabban, ezek a tárgyak más listák (így formálva fák) és szimbólumok, de lehet más tárgyak, mint például szálak, hashtables, felhasználó által definiált objektumok, stb Ezek a szerkezetek nevezett s-EXPS .

Tehát, amikor betölti a forrás fájlt, a Lisp fordítóprogram elemzi a szöveget és termelnek s-EXPS. Makrók működnek ezek. Ez jól működik, és ez egy csodálatos módja annak, hogy kiterjeszti a nyelv a szellem s-EXPS.

Továbbá, a fent említett elemzési folyamat során kiterjeszthető „olvasó makrók”, ​​melyek segítségével testre szabhatja a fordító fordul szöveget s-EXPS. Azt javaslom azonban, hogy magáévá Lisp szintaxisa helyett hajlító, hogy valami mást.

Úgy hangzik, egy kicsit zavaros, ha oldalon Lisp a „funkcionális jellege” és a Ruby „objektum-orientált szintaxis”. Nem tudom, mit jelent a „objektum-orientált szintaxis” kellene lennie, de Lisp egy multi-paradigma nyelv és támogatja az objektum-orientált programozás extremelly is.

BTW, ha azt mondom, Lisp, mármint Common Lisp .

Azt javaslom, hogy tegye a előítéleteket el, és így a Lisp becsületes go .

Válaszolt 26/08/2008 10:36
a forrás felhasználó

szavazat
9

Mit kér valamivel, mint azt kérdezi, hogyan válhat egy szakértő chocolatier, hogy el tudja távolítani az összes pokoli barna cucc a kedvenc csoki torta.

Válaszolt 17/09/2008 13:14
a forrás felhasználó

szavazat
9

Zárójel fene? Nem látok több zárójelben:

(function toto)

mint:

function(toto);

és

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

nem több, mint:

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

Látom kevesebb konzolok és „;” bár.

Válaszolt 16/09/2008 17:23
a forrás felhasználó

szavazat
6

Igen, akkor alapvetően megváltoztatja a szintaxist, és még menekülni „a zárójelben pokol”. Az, hogy meg kell határozni egy új olvasó szintaxis. Nézz be olvasó makrókat.

Én gyanúsított azonban, hogy, hogy elérjék a Lisp szakértelem programozni ilyen makrók akkor kell, hogy merüljön el a nyelvet, hogy olyan mértékben, hogy akkor már nem úgy Parenthese „pokol”. Azaz az idő tudja, hogyan kerüljük el őket, akkor azért jöttek, hogy fogadja őket, mint egy jó dolog.

Válaszolt 15/09/2008 13:07
a forrás felhasználó

szavazat
2

látni ezt a példát, hogyan olvasó makrók is kiterjeszti a lisp olvasó összetett feladatokat, mint az XML sablonozó:

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

ez a felhasználói könyvtár összeállítja a statikus részeket az XML UTF-8 kódolású szó byte tömböt fordításkor hogy készek a levelet-sequence'd a hálózati áramot. és ezek használhatók a normális lisp makrók, azok merőlegesek ... hol van a vessző karaktert hatások mely részek állandó, és ki kell értékelni a futás során.

További részletek érhetők el: http://common-lisp.net/project/cl-quasi-quote/

Egy másik projekt, amely a Common Lisp szintaktikai kiterjesztések: http://common-lisp.net/project/cl-syntax-sugar/

Válaszolt 17/09/2008 01:30
a forrás felhasználó

szavazat
2

Ha azt szeretnénk, lisp kinézni Ruby használni Ruby.

Ez lehet használni Ruby (Python) egy nagyon lisp szerűen, ami az egyik fő oka az általuk szerzett elfogadás olyan gyorsan.

Válaszolt 05/08/2008 08:40
a forrás felhasználó

szavazat
1

Az egyik felhasználási makrók fújt a fejemben volt a fordítási idejű ellenőrzését SQL kérések ellen DB.

Ha rájössz, hogy van a teljes nyelvi kéznél fordításkor, nyit új távlatokat érdekes. Ami azt is jelenti, akkor lőni magát a lábát új és érdekes módon (például rendering összeállítása nem reprodukálható, ami nagyon könnyen alakulnak a hibakeresés rémálom).

Válaszolt 19/09/2008 11:43
a forrás felhasználó

szavazat
1

Ez egy trükkös kérdés. Mivel lisp már szerkezetileg olyan közel elemzési fa közötti különbség számos makrók és végrehajtása a saját mini-nyelv egy elemző generátor nem nagyon világos. De, kivéve a nyitó és a záró zárójel, akkor nagyon könnyen a végén valami úgy néz ki, nem olyan, mint lisp.

Válaszolt 06/08/2008 13:14
a forrás felhasználó

szavazat
1

@sparkes

Néha LISP a nyelvhelyesség választás, nevezetesen Emacs kiterjesztéseket. Biztos vagyok benne, tudtam használni Ruby kiterjeszteni Emacs, ha akartam, de Emacs úgy tervezték, hogy meg kell hosszabbítani a LISP, úgy tűnik, hogy van értelme használni ebben a helyzetben.

Válaszolt 05/08/2008 08:45
a forrás felhasználó

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