Vă mulțumim pentru susținere

Cât de departe pot merge macro-urile LISP?

Am citit foarte mult că LISP poate redefini sintaxa în zbor, probabil cu macrocomenzi. Sunt curios cât de departe merge acest lucru? Puteți redefini structura lingvistică atât de mult încât aceasta să devină un compilator pentru o altă limbă? De exemplu, ați putea schimba natura funcțională a LISP într-o sintaxă și o semantică orientată mai mult pe obiect, poate spune că sintaxa este mai apropiată de ceva asemănător cu Ruby?

În special, este posibil să scapi de iadul parantezei folosind macro-uri? Am învățat suficient (Emacs-) LISP pentru a personaliza Emacs cu propriile micro-caracteristici, dar sunt foarte curios cât de departe pot intra macro-urile în personalizarea limbii.

0
adăugat editat
Schemele de macrocomenzi sunt foarte puternice. Am scris o implementare LINQ completă ca o schemă macro înapoi. https://ironscheme.svn.codeplex.com/svn/ IronScheme / IronSchem & zwnj; eConsole / ironscheme / & zwnj; linq.ss Cu toată această putere, am rămas fără idei bune să o aplic!
adăugat autor leppie
adăugat autor Özgür
Rețineți că lisp este orientat obiect. Vedeți sistemul obișnuit Lisp Object.
adăugat autor catphive

7 răspunsuri

@sparkes

Uneori LISP este alegerea clară a limbii, și anume extensiile Emacs. Sunt sigur că aș putea să-l folosesc pe Ruby pentru a-mi extinde Emacs dacă aș fi vrut, dar Emacs a fost proiectat să fie extins cu LISP, așa că pare logic să-l folosești în această situație.

0
adăugat

Dacă doriți ca lisp să arate ca Ruby folosi Ruby.

Este posibil să utilizați Ruby (și Python) într-un mod foarte asemănător, care este unul dintre principalele motive pentru care au fost acceptate atât de repede.

0
adăugat

E o întrebare dificilă. Deoarece lisp este deja structural atât de aproape de un parabolă, diferența dintre un număr mare de macrocomenzi și implementarea propriului dvs. mini-limbaj într-un generator de parser nu este foarte clară. Dar, cu excepția părții de deschidere și de închidere, ați putea ajunge cu ușurință cu ceva care nu arată nimic ca lisp.

0
adăugat
"cu excepția părții de deschidere și închidere" <- Puteți chiar schimba acest lucru. Vedeți planetă .plt-scheme.org / package-source / chongkai / sml.plt / 1/6 / & hellip; pentru Standard ML încorporat în Schemă (Rachetă) utilizând schema echivalentă a macro-ului cititorului.
adăugat autor p4bl0

Macrogramele regulate funcționează pe liste de obiecte. Cel mai frecvent, aceste obiecte sunt alte liste (formând astfel copaci) și simboluri, dar pot fi și alte obiecte, cum ar fi șiruri de caractere, hashtables, obiecte definite de utilizator etc. Aceste structuri sunt numite s-exps .

Deci, atunci când încărcați un fișier sursă, compilatorul dvs. Lisp va analiza textul și va produce s-exp. Macrorele funcționează pe acestea. Aceasta funcționează minunat și este o modalitate minunată de a extinde limba în spiritul s-exp.

În plus, procesul de parsare menționat mai sus poate fi extins prin "macrocomenzi pentru cititori" care vă permit să personalizați modul în care compilatorul transformă textul în s-exp. Totuși, sugerez să îmbrățiți sintaxa lui Lisp în loc să o îndoiți în altceva.

Sună puțin confuz când menționezi "natura funcțională" a lui Lisp și "sintaxa orientată pe obiect" a lui Ruby. Nu sunt sigur ce ar trebui să fie "sintaxa orientată pe obiecte", dar Lisp este un limbaj multi-paradigm și susține programarea orientată pe obiecte extremelly bine.

BTW, când spun Lisp, vreau să spun Common Lisp .

Vă sugerez să vă puneți prejudecățile departe și dați Lisp un drum cinstit .

0
adăugat

Nu sunt un expert Lisp, nici măcar nu sunt un programator Lisp, dar după ce am experimentat puțin limba, am ajuns la concluzia că după o vreme paranteza începe să devină "invizibilă" și începi să vezi codul ca vrei să fie. Începeți să acordați mai multă atenție construcțiilor sintactice pe care le creați prin intermediul s-exprs și macrocomenzile și mai puțin forma lexicală a textului listelor și parantezelor.

Acest lucru este valabil în mod special dacă profitați de un editor bun care vă ajută la colorarea de indentare și sintaxă (încercați să setați paranteza la o culoare foarte asemănătoare cu fundalul).

S-ar putea să nu puteți înlocui limba complet și să obțineți sintaxa "Ruby", dar nu aveți nevoie de ea. Datorită flexibilității limbajului, ați putea termina un dialect care se simte ca și cum ați urma stilul de programare "Ruby" dacă vreți, indiferent ce ar însemna pentru dvs.

Știu că e doar o observație empirică, dar cred că am avut una din acele momente de iluminare Lisp când mi-am dat seama de asta.

0
adăugat

Da, puteți schimba în mod fundamental sintaxa și chiar să scăpați de "icoane paranteze". Pentru aceasta, va trebui să definiți o nouă sintaxă a cititorului. Uită-te în macro-urile cititorilor.

Bănuiesc însă că, pentru a ajunge la nivelul expertizei Lisp pentru a programa astfel de macrocomenzi, va trebui să vă scufundați în limba într-o asemenea măsură încât să nu mai luați în considerare parchetul "iad". I.E. până când știi cum să le eviți, vei fi venit să le accepți ca un lucru bun.

0
adăugat

Aceasta este o întrebare foarte bună.

Cred că este nuanțată, dar cu siguranță responsabilă:

Macrorele nu sunt blocate în s-expresii. Vedeți macrocomanda LOOP pentru o limbă foarte complexă scrisă folosind cuvinte cheie (simboluri). Deci, în timp ce puteți începe și încheia bucla cu paranteze, în interiorul ei are sintaxa proprie.

Exemplu:

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

Acestea fiind spuse, cele mai multe macro-uri simple folosesc doar s-expresii. Și tu ai fi "blocat" folosind-le.

Dar s-expresii, așa cum a răspuns Sergio, încep să se simtă bine. Sintaxa iese din cale și începeți codarea în arborele de sintaxă.

În ceea ce privește macrocomenzile pentru cititori, da, ați putea scrie ceva de genul:

#R{
      ruby.code.goes.here
  }

Dar ar trebui să scrieți propriul parser de sintaxă Ruby.

De asemenea, puteți mima câteva constructe Ruby, cum ar fi blocuri, cu macrocomenzi care se compilesc la construcțiile Lisp existente.

#B(some lisp (code goes here))

s-ar traduce la

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

Consultați această pagină pentru a afla cum să faceți acest lucru.

0
adăugat
Aceasta este o întrebare foarte bună. Dar nu pentru stackoverflow.com; nu este o sarcină sau ceva care să poată fi răspunzător definitiv fără opinii și religie care să intre în golurile în care analiza se trasează în chiuvete nedefinite.
adăugat autor Kaz
Exemplul dvs. de macro "nu blocat în s-expresii" arată ca o s-expresie pentru mine.
adăugat autor Hugh Allen
Exemplul macro pentru buclă este un s-expr, dar "sub-expresiile" nu sunt.
adăugat autor Eric Normand