Tipografie necorespunzatoare verifica codul pe care l-ati scris, nu codul pe care l-au scris macro-urile dvs. Acest lucru face ca macro-urile sa se simta ca facand parte din limba, nu ca pe ceva abordat.

Pentru un pitch mai complet, consultati http://unseemly.github.io

Unseemly are un minim de forme necesare pentru a initia implementarea limbajelor practice.

Unseemly este inca destul de incipient, asa ca, desi exista toate caracteristicile de mai jos, exista inca o serie de lucruri care sunt ciudate sau incomplete.

Caracteristici

Din familia ML

  • Tipuri algebrice (de exemplu, suporta structuri si enumeri (bogate))
  • Destructurarea Typesafe cu chibrit.
  • Tipuri generice (sau tipuri parametrice) (de exemplu, Lista <T>)
  • Tipuri recursive

Din familia Scheme

  • Cvasicotarea sintaxei („[Expr |…]” citeaza o expresie, dar in interiorul acesteia, [Expr |…], evalueaza continutul acesteia si le interpoleaza)
  • Imprimarea destul de mare respecta invocatiile macro si sintaxa citata (imprimanta draguta este insa destul de limitata in acest moment)
  • Macro-uri igienice (toate operatiile respecta echivalenta α)
  • Macro By Example (implementati cu usurinta formulare n-ary fara a scrie bucle de tip boilerplate).

Caracteristici unice

  • Verificarea tipica sub cotatia de sintaxa (deci „[Expr | (plus unu, [e1],)]” este o eroare de tip daca e1 are tipul Expr <String>)
  • Nu exista erori de tip in codul generat (daca o macrocomanda de invocare macro, codul la care se extinde nu are nevoie de verificare de tip) †.
  • Parsare extensibila si lexing (scrieti SQL real sau regexuri reale in linie, nu siruri).

† Cu exceptia faptului ca exista erori de soliditate cunoscute.

Alte caracteristici

  • REPL cu functii complete, cu istoric de comanda persistent si editarea liniei (prin amabilitatea rustyline).

Cum sa-l foloseasca

Instalati Rust, daca nu ati facut deja:

Din directorul depozitului Unseemly, rulati un exemplu de program:

cargo run –release src / examples / sum_list.unseemly

(Recomandat) Obtineti preludiul implicit pentru REPL nepotrivit:

cp src / examples / .unseemly_prelude ~ /

Porniti REPL:

Documentatie

Uitati-va la core_language_basics.md pentru documentatia limbii.

Lucrari conexe

Proiecte de cercetare

FreshML / Romeo

Unseemly se bazeaza cel mai strans pe Romeo, care coboara din FreshML. (Romeo este mai aproape de Pure FreshML, dar partea „Pure” nu este prezenta in Unseemly.) Romeo a permis manipularea tipurilor de sintaxa cu informatii complexe de legare, dar

  • sintaxa a fost altfel netipata
  • nu a existat niciun sistem macro (deci manipularea sintaxei a fost inutila!)
  • este doar un calcul de baza

SugarJ / SoundX

SoundX este un limbaj cu extensii de sintaxa in care verificarea tipografica are loc inainte de extindere. Ofera extensii de limbaj sonor, dar

  • nu accepta adnotari obligatorii (in practica, aceasta inseamna ca autorii extensiei de sintaxa incheie scrierea specificatiilor care contin lucruri logice cum ar fi x ∉ dom (E).)
  • extensiile de limba nu sunt macrocomenzi (ele nu fac parte din limba)
  • este doar un calcul de baza

(TODO: extensiile in sine sunt verificate static pentru a pastra tipul? Cred ca da, dar nu-mi amintesc sigur.)

Limbi practice

Scala

Daca inteleg corect, macro-urile Blackbox ale Scala sunt verificate in mod tipic inainte de extindere, dar nu pot face tot ceea ce pot face macro-urile Whitebox. Macrocomenzile necorespunzatoare sunt verificate tipic inainte de extindere, dar sunt singurul sistem macro necesar, deoarece pot (in special) sa defineasca noi forme de legare in siguranta. (TODO: aflati mai multe despre sistemul macro Scala)

Wyvern

Exemplul principal motivant al lui Wyvern (scrie SQL, nu siruri care contin SQL, in codul tau de uz general) seamana mult cu viziunea Unseemly a extensiei de sintaxa inline. Wyvern este un limbaj cu drepturi depline, nu un limbaj de baza. Cred ca scrierea de noi limbi incorporate nu este la fel de usoara ca definirea macro.

Wyvern include, de asemenea, o serie de caracteristici care sunt in afara domeniului Unseemly.

(TODO: aflati mai multe despre Wyvern)

Terra

Terra, dintr-o privire rapida (TODO: aflati mai multe), pare a fi un limbaj cu o relatie stransa cu Lua, asemanatoare cu relatia pe care ar avea-o limbile bazate pe Unseemly.

In acest caz, se pare ca obiectivul este de a casatori impreuna un limbaj la nivel inalt si la nivel scazut, fara FFI si cu incorporare in linie.

Rust and SweetJS

Rust si SweetJS sunt limbaje care nu sunt bazate pe expresii S, cu sisteme macro care permit o sintaxa bogata.

Unseemly este implementat in Rust si foloseste o multime de macrocomenzi.