Anotace a syntax

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Grudl
Nette Core | 8227
+
0
-

Téma anotací se slušně rozjíždí a mám pocit, že by to mohla být příští velká věc. Přesto je potřeba vyřešit pár klíčových věcí, jako je striktnost nebo dědičnost a přidám ještě jednu – syntax anotací.

Tady je potřeba zmínit, že samotný framework už několik dalších jazyků zavádí na různách místech. Možná až překvapí kolik jich je:

  • Route: '<presenter>/[<action>/[<id \d{1,3}>]]'
  • Html: Html::el('a lang=cs href="#" title="" selected')
  • config.ini: php.iconv.internal_encoding = "%encoding%"
  • LatteFilter: {include #this, menu => $item}
  • LatteMacros: <p n:if="true">Ahoj</p>
  • Annotations: @secured(role = "admin", level = 2)

A samozřejmě máme velmi úzce související jazyky standardizované:

  • HTML: <input lang=cs title="" selected>
  • XHTML: <input lang="cs" title="" selected="selected" />
  • JSON: {"lang": "cs", "title": "", "selected": true}
  • JavaScript: {lang: "cs", title: '', selected: true}
  • PHP: array('lang' => 'cs', 'title' => '', 'selected' => true)

Bylo by dobré jít spíš cestou sjednocení. Plné sjednocení není dost dobře možné ani vhodné, protože jde o DSL lišící se svým účelem a způsobem parsování, ale základní pravidla by měla být jednotná. Už proto, že se většina těchto jazyků točí kolem toho, jak zapsat hashtable.

Petr Motejlek
Člen | 293
+
0
-

Já znám anotace z Javy a myslím, že tam jsou velmi pěkně pořešené. Pokud bych měl hlasovat, tak bych hlasoval pro Javovskou syntax, tj. to, co uvádíš jako jazyk Annotations v první půlce příspěvku.

paranoiq
Člen | 392
+
0
-

jak až daleko bys chtěl se sjednocováním zajít?
čtyři ze zmíněných šesti příkladů mají naprosto stejný základ. vždy jde jen o serializaci hashe

příklad s rovnítky:

Html: Html::el('a, lang=cs, href="#", title="", selected')
config.ini: php.iconv.internal_encoding="%encoding%"
LatteFilter: {include #this, menu=$item}
Annotations: @secured(role=admin, level=2)

příklad s dvojtečkami:

Html: Html::el('a, lang: cs, href: "#", title: "", selected')
config.ini: php.iconv.internal_encoding: "%encoding%"
LatteFilter: {include #this, menu: $item}
Annotations: @secured(role: admin, level: 2)

jen routy jsou dost specifické a u LatteMacros je asi účelem aby vypadaly jako běžné html atributy

Editoval paranoiq (30. 4. 2010 13:13)

David Grudl
Nette Core | 8227
+
0
-

On je tam ve skutečnosti ještě jeden drobný rozdíl, vlastně docela dramatický. Spíš než

Html: Html::el('a, lang=cs, href="#", title="", selected')

se očekává

Html: Html::el('a lang=cs href="#" title="" selected')

Viděl bych to tak, že = a : bude mít odlišné chování. Zatímco za rovnítkem musí být právě jeden token a čárka bude nepovinná, za dvojtečkou se bere vše až do oddělovače.

paranoiq
Člen | 392
+
0
-

zajímavé. takže lang=cs href="#" title="" by se rovnalo lang: cs, href: "#", title: ""?
ale otázka zůstává. kam až chceš s tím jednotným parserem zajít? bude používán i na všechny tyhle situace?

David Grudl
Nette Core | 8227
+
0
-

Na konfiguraci, na anotace a například zmíněný konstruktor třídy Html.

V šablonách bude parser jiný, ale bylo by fajn zachovat příbuzné konvence. I když to asi vždy úplně nepůjde.

Cifro
Člen | 245
+
0
-

Je možné v anotáciách definovať pole? Čo som pozeral do parsera, tak múdry som z toho nebol.

redhead
Člen | 1313
+
0
-

Cifro napsal(a):

Je možné v anotáciách definovať pole? Čo som pozeral do parsera, tak múdry som z toho nebol.

To už jsem navrhoval, bohužel ne.. :(

Honza Marek
Člen | 1664
+
0
-

Jedině řetězec oddělenej čárkama nebo něco a pak si to rozdělit sám.

Cifro
Člen | 245
+
0
-

Honzo to práve v tvojom Ormione som potreboval.

/**
 * @hasOne(name = layoutTemplate, referencedEntity = Models\Template, column = layoutTemplateId, referencedColumn = id, conditions = "type=layout")
 */

Potreboval som doplniť to conditions pre upresnenie vyhľadania záznamu. Odelené čiarkamy by mi veľmi nepomohlo lebo som potreboval pole kľúč => hodnota, tak som použil parse_str(), kde potom reťazec musí byť v tvare napr. conditions="type=layout&published=1&allowed=1". Nie je to extra najlepšie, ale funguje no…

paranoiq
Člen | 392
+
0
-

Cifro napsal(a):

Je možné v anotáciách definovať pole? Čo som pozeral do parsera, tak múdry som z toho nebol.

v předchozí implementaci fungovalo následující, ale nevím, zda je to stále podporováno:

/**
 * @anotace(1);
 * @anotace(2);
 */
// výsledek: [1,2]

Editoval paranoiq (10. 6. 2010 12:51)

redhead
Člen | 1313
+
0
-

Já spíš myslel toto:

/** @anotace(abc = 1, pole = [a = 1, b = 2, ...]) */
pak
$an->abc == 1
$an->pole == array('a' => 1, 'b' => 2, ...)
Patrik Votoček
Člen | 2221
+
0
-

paranoiq napsal(a):

v předchozí implementaci fungovalo následující, ale nevím, zda je to stále podporováno:

/**
 * @anotace(1);
 * @anotace(2);
 */
// výsledek: [1,2]

V nové verzi záleží na tom jak k tomu přistupuješ. https://doc.nette.org/…tion/anotace

Honza Marek
Člen | 1664
+
0
-

redhead napsal(a):

Já spíš myslel toto:

/** @anotace(abc = 1, pole = [a = 1, b = 2, ...]) */
pak
$an->abc == 1
$an->pole == array('a' => 1, 'b' => 2, ...)

Za tohle bych se velmi, ale opravdu velmi přimlouval.

Mikulas Dite
Člen | 756
+
0
-

Jestli se i pro anotace bude používat Neon parser, tak to bude fungovat pěkně.

redhead
Člen | 1313
+
0
-

Už kdysi dávno jsem to navrhoval tu: https://forum.nette.org/…seni-anotaci?…

Bez nějaké velké odezvy.. (Je tam psáno i o eval()u, že by se dali parsovat i nějaké složitější jazykové konstrukce, ale to bych vypustil, prostě jenom podpora pole, by byla fakt pecka)