introducere
Referințe la nume
Rezoluția numelui
Care sunt numele?
Probleme care pot apărea atunci când se utilizează quasicates
Schimbări în îmbinări
Quasicitatele sunt un instrument care simplifică generarea de cod. Quasicite este un șablon pentru o bucată de cod. În exterior, se pare că este o linie care conține un fragment de cod, dar, spre deosebire de un șir, codul din cvasi-cotație este în formă de AST. Aceasta vă permite să controlați corectitudinea sintactică a codului generat și, de asemenea, vă permite să împiedicați capturarea de nume din contextul extern și oferă alte caracteristici convenabile.
Prefixul "cvasi" inseamna ca citatele pot avea destinatii de substitutie, in care AST poate fi introdus. Asemenea puncte din Nemerle sunt numite splice.
În Nemerle, tot codul este reprezentat sub forma AST. Aceasta vă permite să combinați codul scris manual de către programator cu codul obținut prin ghilimele.
În acest articol, vom discuta despre caracteristicile noi sau non-triviali de lucru cu quasitsets Nemerle. Deci, dacă aveți nevoie de o introducere generală la această întrebare, căutați alt material.
Referințe la nume
Probabil cel mai dificil și în același timp interesant subiect este subiectul formării referințelor la nume din interiorul quasit-urilor.
Nemerle susține așa-numita igienă. În practică, acest lucru înseamnă că numele introdus în macro (în cvasi-cota din macro) nu se poate intersecta cu numele introdus de programator în codul scris de mână. De exemplu, dacă creăm o macrocomandă:
În exemplele noastre, culoarea finală și utilizată, și globală sunt aceleași. Dar nu trebuie să fie așa. Splice global va da întotdeauna o "culoare globală", în timp ce valoarea combinației useite depinde de locul în care este aplicată macro-ul în care este declarată cvasi-cotația. De exemplu, dacă vă referiți la o macrocomandă dintr-un cvasi-citat dintr-o macrocomandă diferită, culoarea globală va fi culoarea macro-ului.
Cum să decideți ce tip de îmbinare să folosiți?
Răspunsul meu este simplu - încercați să faceți fără feliile. Dacă trebuie să vă referiți la un nume dintr-un context diferit, încercați să utilizați îmbinarea utilizată. Dacă trebuie să declarați nume vizibile la nivel global, atunci folosiți globale. Și dacă trebuie să te referi la un nume, și nu poate fi folosit niciun alt tip de îmbinare, atunci folosește dyn.
În general, rețineți că dyn este o încălcare completă a regulilor de igienă. Poate fi utilizată doar ca o ultimă soluție.
Rezoluția numelui
Deși acest lucru nu este interzis, nu este întotdeauna necesar să se scrie nume complet calificate în macro-uri (de exemplu, pentru tipuri). În schimb, puteți deschide tipurile necesare utilizând directiva de utilizare și utilizați nume simple (constând în același identificator) sau relative:
În plus față de aceste tipuri de îmbinări, există, de asemenea, o îmbinare de nume de tip. Vă permite să înlocuiți în citat un obiect de tip Name. Acest obiect este descris în următoarea secțiune. În plus, acest articol are o secțiune privind problemele care pot apărea atunci când se utilizează cvasi-citatele asociate cu acest obiect.
Care sunt numele?
Fiecare macro a nivelului de expresie din Nemerle își formează propriul context unic cu care este asociată "culoarea" unică. "Culoare" este o expresie figurativă, în spatele căreia se află un identificator întreg, obținut printr-o simplă creștere.
Codul de utilizator are o culoare cu un identificator fix având valoarea "1".
Numele formate în cvasi-citate primesc o culoare atribuită unui context specific. Astfel, culorile din toate macrocomenzile de nivel de expresie și din codul scris de mână nu se suprapun. Aceasta se numește "igienă". Igiena previne erorile greu de detectat care apar adesea în macrocomenzile C / C ++ și în macro-urile Lisp (unde această problemă este ocolită, dar nu la fel de elegantă ca în Nemerle).
Numele din Nemerle este reprezentat de numele clasei:
Iată o descriere a câmpurilor sale:
- idl este numele în sine.
- culoarea este culoarea numelui.
- context - contextul în care numele a fost declarat. Contextul stochează informațiile necesare asocierii unui nume. Folosindu-l, puteți "asocia" numele cu definiția sa, fără a fi în proces de scriere.
- ParsedId este numele în forma în care a fost primit în timpul parsării. Această valoare poate uneori să difere de valoarea "idl" și poate să nu fie întotdeauna specificată.
- Locație - o proprietate definită în clasa de bază. Acesta vă permite să găsiți locația identificatorului în cod. Dacă identificatorul este definit în codul scris de mână, atunci acesta va indica locul definiției sale. Dacă într-o macrocomandă, atunci locul de aplicare a macrocomenzii sau pe codul generat pentru macro, dacă creatorul macrocomandei a vrut să o facă. Această proprietate poate fi folosită în mesajele de eroare, este de asemenea folosită de IDE pentru a obține informații meta despre cod.
Informații despre clasa Nume sunt furnizate numai în scopuri educaționale. În practică, ar trebui să încercați să nu o utilizați direct.
Probleme care pot apărea atunci când se utilizează quasicates
În ciuda faptului că utilizarea cvasi-citate este foarte convenabilă și poate simplifica foarte mult generarea de cod, atunci când este folosit în Nemerle, pot apărea probleme. Motivul pentru aproape toate aceste probleme constă în încercarea de a reutiliza obiecte de tip Name în diferite locuri din citat sau în diferite citate. De fapt, aceasta este o eroare de compilator. Dar aceasta este o eroare de sistem și nu este atât de ușor să o elimini. Deși nu este eliminată, trebuie să vă amintiți de ea și să luați măsuri astfel încât să nu apară.
Reutilizarea poate apărea ca rezultat al manipulării manuale a unui obiect Nume, de exemplu: