Ten whitespace, ktery zde neni zanedbatelny - se tokenizuje nebo zpracovava jak (prakticky / akademicky) ?
Prijde mi to jako nechutny hack, ktery nutne musi porusovat rozdeleni do syntaktickych a semantickych vrstev parsovani zdrojaku pro vysledny AST.
Jesteze za meho studia na VUT jsme takoveto bleh jazyky nemuseli zpracovavat v predmetu s prekladaci :-) A ani ted... po 20 letech nechapu proc nekdo vubec pouziva Python. Uz jen potreba specialniho editoru, co by umel odsazovat bloky je pro me showstopper.
Jako INDENT (zacatek odsazeneho bloku) a DEDENT (konec odsazeneho bloku).
> jak (prakticky / akademicky) ?
nevim co znamena akademicky, prakticky tokenizer sleduje pocet mezer na zacatku radku, pokud je vetsi nez predchozi, vlozi INDENT, pokud mensi nez predchozi a odpovida nektere z predchozich urovni odsazeni, vlozi odpovidajici pocet DEDENT. Pokud je mensi, ale neodpovida zadne z predchozich urovni, vyhodi vyjimku.
https://github.com/python/cpython/blob/3.10/Lib/tokenize.py#L509
uvnitr zavorek a viceradkovych retezcu je odsazeni ignorovano
YAML je ovšem ještě horší věc. V Pythonu, když už není na obrazovce vidět, kde začíná blok (odsazení), tak je jasný, že se musí refaktorovat a ideálně mít celý blok až na první úroveň celý na obrazovce, nikdy ne delší.
Jenže do YAMLu se ukládá konfigurace, tam se refaktorovat nedá a já tam fakt dost často nevidím, kolik těch mezer mám narvat. Proti tomu je Python zlatý :-)
* aneb když někdo něco slepě okopíruje a nepřemýšlí u toho
Co je na něm tak špatného? Já se k YAMLu dostal díky Home Assistentu a ESPHome. Na takovéto konfigurace mi to přijde mnohem lepší než JSON, XML a INI. Editor VSCode ukazuje barevně levely odsazení takže se v tom lehce orientuje. Ale asi jsem se nikdy nedostal k nějakému extrémně dlouhému a složitému YAMLu jako vy.
Ale vůbec ne, prostě jen namísto klasického lexeru tam je lexer s hackem - pamatováním stavu*. Jestli je to dobře nebo špatně, to těžko posoudím, protože prakticky v každé naší aplikaci/službě nějaký takový hack máme taky :-)
* tedy i klasický lexer si většinou musí něco pamatovat, typicky aspoň jeden "budoucí" znak nebo to musí umět knihovna, kterou používá (ungetc() nebo podobně).
Rád bych upozornil, že třeba takový Haskell to má taky tak, a není s tím žádný zvláštní problém. Prostě se to parsuje. Když máte dostatečně inteligentní nástroj, jako třeba https://hackage.haskell.org/package/parsec je odsazování pomocí whitechars prostě jen další logika.
Ukladat logiku do whitespace je iste skvely napad nepodobny brainfucku. Ja by som sa nebranil, podme dalej. Skusme vymysliet este aj kombinacie medzery, tvrdej medzery a TABu. To by vzdy mohlo robit nieco zaujimave.
To ze odsadenie 'pomaha' ludskemu oku lepsie sa orientovat v strukturovanom texte neznamena ze je to aj dobry napad na ukladanie logiky lebo prave tak sa tam moze aj nieco nenapadne stratit.
@RDa
To nechápu. Připsaní snad každého jazyku odstazujete bloky, dokonce i pokud se používají ty slavné závorky. Pokud je někdo prase, tak je úplně jedno jestli se pouze odsazuje, nebo se použijí i závorky - např. javascript a nebo lisp, že. A napsat spaghetti traktát bez odsazení od shora až dolů, to je taky úžasné.
Proč někdo používá Python? Třeba proto kolik obsahuje knihoven v kombinaci s dynamickým typováním a celkem bezproblémovou exekucí skriptů. Na ad-hoc stahování dat z různých API a mixování statistik je úplně ideální.
Stačí jeden skript. Když zabrousíte na stránky NASA, i automatický formater najdete ;-) :-D
6. 8. 2022, 13:43 editováno autorem komentáře
Klasika, odsadzovanie vadí hlavne tým, ktorí Python nepoužívajú. :)
Mimochodom, ku Pythonu a F# sa nedávno pridala aj Scala 3. Kód bez zložených zátvoriek vyzerá oveľa lepšie.
package checkbox import javafx.application.{Application, Platform} import javafx.event.{ActionEvent, EventHandler} import javafx.geometry.Insets import javafx.scene.Scene import javafx.scene.control.CheckBox import javafx.scene.layout.StackPane import javafx.stage.Stage import javafx.scene.layout.HBox class CheckBoxApp extends Application { override def start(stage: Stage): Unit = stage.setTitle("CheckBox") val cbox = new CheckBox("Show title") cbox.setSelected(true) cbox.setOnAction((_: ActionEvent) => { if cbox.isSelected() then stage.setTitle("CheckBox") else stage.setTitle("") }) val root = new HBox root.setPadding(new Insets(25)) root.getChildren.add(cbox) stage.setScene(new Scene(root, 400, 300)) stage.show() } @main def main(): Unit = Application.launch(classOf[CheckBoxApp])
V Scale 3 sú zložené zátvorky voliteľné. Tak nakoniec možno v danom príklade odstrániť všetky zložené zátvorky:
package checkbox import javafx.application.{Application, Platform} import javafx.event.{ActionEvent, EventHandler} import javafx.geometry.Insets import javafx.scene.Scene import javafx.scene.control.CheckBox import javafx.scene.layout.StackPane import javafx.stage.Stage import javafx.scene.layout.HBox class CheckBoxApp extends Application: override def start(stage: Stage): Unit = stage.setTitle("CheckBox") val cbox = new CheckBox("Show title") cbox.setSelected(true) cbox.setOnAction((_: ActionEvent) => if cbox.isSelected() then stage.setTitle("CheckBox") else stage.setTitle("") ) val root = new HBox root.setPadding(new Insets(25)) root.getChildren.add(cbox) stage.setScene(new Scene(root, 400, 300)) stage.show() @main def main(): Unit = Application.launch(classOf[CheckBoxApp])
Mne to nepripadá neprehľadné, tu to na roote vyzerá (všeobecne) kód horšie , ale v textovom editore je to fajn. Jediné s čím som sa stretol je, že automatické formátovanie kódu je náročnejšie a nefunguje vždy dobre.
F# napríklad má aj verbose syntax, kde sa blok môže ukončiť kľúčovým slovom done, ale rovnomerné odsadenie sa vyžaduje stále.
for n in 2..12 do printfn "%i" n printfn "%i" (n * n) done for n in 2..12 do printfn "%i" n printfn "%i" (n * n)