Skvely clanek, zajimave tema.
Na muj vkus Common Lisp trochu naduziva makra.
Mate subjektivni nazor na Common Lisp vs Clojure ciste jako jazyk, bez ohledu na JVM?
Za me, nejpouzitelnejsi Lisp je asi Clojurscript, diky soucasne popularite Javascriptu. Nelze cekat vznik ciste lispovskeho ekosystemu knihoven velikosti srovnatelneho s mainstreamovymi jazyky, interop s jinymi jazyky je dobra cesta.
Takto - skalni CLisperi casto rikaji, ze Clojure ma "moc syntaxe". Me se na Clojure libi ten funcionalni pristup, jenze zase to nekdy vede k divnemu kodu (nekde mam par ukazek, ktere jsem nedokazal rozumne vyresit ciste funkcionalni cestou). Ale Richuv pristup k jazyku je konzistentni, akorat s nim uplne nesouhlasim s temi "VM jsou OS budoucnosti".
Za me by byl idealni jazyk jako Clojure (pekne konzistentni knihovny, sekvence, line vyhodnocovani by default, go bloky), ale tak rychle startujici jako CL, vcetne moznosti buildu binarek (tedy neco jako Bahashka, vlastne Bahashka + vlastni skript se k tomu dost blizi). Ale to je jak pises - problem neexistujiciho ekosystemu.
PS: zrovna CL makro Loop bych v Clojure bral, stavajici loop-recur je sice pouzitelne, ale okolo toho moc kodu navic :)
“nekde mam par ukazek, ktere jsem nedokazal rozumne vyresit ciste funkcionalni cestou”
To by mne docela zajímalo.
Jinak mně osobně se líbí přístup Idrisu, je sice funkcionální, ale umožňuje procedurální zápis (shodou náhod přes “do”, ale na rozdíl od Haskellu se nejedná o Kleisliho kompozici, skládání je mnohem volnější, a tedy procedurálnější). Ve spojení se “syntax extensions” ideální pro převážně funkcionální kód bez nepříjemných teoretických omezení.
https://github.com/babashka/babashka
Babashka is a native Clojure interpreter for scripting with fast startup. Its main goal is to leverage Clojure in places where you would be using bash otherwise.
Špatně to píšeš, je to ba-bash-ka.
16. 4. 2022, 07:11 editováno autorem komentáře
Na Common Lispu jsem měl vždy problém pochopit jednu podstatnou věc. Jedná se rozsáhlý, standardizovaný, velmi rychlý, průmyslově orientovaný, stabilní, dobře promyšlený, extrémně mocný, moderní a rozšířitelný jazyk. Proč se, sakra, nepoužívá tolik, jak by si zasloužil?
Viděl jsem na toto téma hodně diskusí, ale nemohu říct, že by mi jejich závěry přišly opravdu relevantní. Většinou to skončí u toho, že svádí programátora k překomplikovaně obecnému řešení místo toho, aby se soustředili prostě na vyřešení daného problému. Argumenty se závorkovým peklem není moc věrohodný, když algolovské jazyky jich mají obvykle stejné množství s výjimkou věcí, co řeší speciálními operátory.
Takže, prosím, zkuste odpovědět. Proč nepoužíváte Common Lisp? Já jej osobně nepoužívám, protože místo něj používám Smalltalk, ale vy ostatní omluvu nemáte ;-)
Common Lisp je jeden z mnoha programovacích jazyků, takže "správná" otázka by mohla znít, proč bychom měli používat zrovna tenhle. No ale OK, moje zkušenosti:
Když jsem se snažil si s CL hrát, byl prvotní problém právě v té mnohosti implementací, kterou zmiňuje autor článku. Mám používat CMUCL, nebo SBCL? Případně jiný?
Další problém byl ekosystém - knihovny a jak s nimi pracovat. Byly nějaké nástroje pro řešení závislostí, ale nedalo se to srovnat s "moderními" systémy typu npm a cargo a myslím, že ani s cabal/hackage.
Další problém byl v tom, že CL je jazyk, který umožňuje dělat všechno tisíci způsoby. Mně tohle nevyhovuje, z podobných důvodů mi nesedl Perl nebo C++. Prostě dávám přednost jazykům, které jdou cestou "ortogonality" a "idiomatičnosti", tzn. najít pokud možno nejvhodnější postup a držet se ho, pokud není zásadní důvod to udělat jinak.
Závorky jsou problém (pro mě), jelikož u jazyků, které mají (), [] i {}, se já osobně podstatně lépe vyznám v kódu. Možná to někdo má jinak, o tom se nemá smysl přít.
Takže, abych to shrnul - preferuju jazyky s "návodnou syntaxí", které mají kvalitní ekosystém, mně vyhovující komunitu, "one preferred way" pro konkrétní problém a jednu referenční implementaci, na kterou se komunita soustředí a rozvíjí ji. Common Lisp nemá ani jedno z toho.
Jen zareaguju na ekosystém + knihovny. V Common Lispu se totiž správa knihoven neprovádí na příkazovém řádku (typu pip install ...), ale přímo z REPLu - což ovšem znamená, že se mění spuštěná image Lispu. Tedy ještě jinak - můžu mít 100 běžících REPLů/image, každý s jinou sadou knihoven (takže se neřeší virtuání prostředí a další narovnáváky na ohýbáky).
Navíc je repositář knihoven v CL hodně podobný repositářím Linuxových dister - prostě cokoli se nainstaluje z daného obrazu, bude spolu kompatibilní. Ten repositář se buildí každou chvíli. A zase je to něco, co souvisí se stabilitou CL a jeho ekosystému.
To bych asi potřeboval nějak přiblížit, těžko se mi to představuje. Dělám větší aplikaci, potřebuju tam dát závislosti na knihovnách, knihovny se vyvíjejí. To znamená, že chci/potřebuju mít (já nevím) knihovnu pro AES ve verzi 3.x, knihovnu pro generátory pseudonáhodných čísel verze 2.x atd.
Uvolním to jako FOSS program, zveřejním na GitHubu, co má uživatel udělat, aby se mu to celé nainstalovalo a spustilo? Bude muset řešit nějaké REPL image a distribuce? V Rustu udělám cargo install MySuperApp a mám to tam. Případně udělám checkout z repozitáře, pustím instalaci z toho checkoutu a všechno by mělo jet. Je to podobné i v tom Common Lispu?
14. 4. 2022, 10:49 editováno autorem komentáře
Teď to hodně zjednoduším (a dá se to ohnout, ale popravdě to asi nikdo nedělá).
1. knihovny se až tak nevyvíjejí, že by něco rozbíjely, a když už, tak se mění i jejich závislosti a tranzitivní závoslosti (tedy celý strom)
2. v quicklispu se to (zjednodušuji) řeší tak, že se vydávají snapshoty knihoven, které se buildí spolu *
3. dá se vracet v čase dozadu na libovolný snapshot (http://blog.quicklisp.org/2011/08/going-back-in-dist-time.html), ale prostě CL ekosystém je trošku jiný - věci jsou stabilní (v řádu let, i desítek let), takže to (IMHO) zase tak moc potřeba není.
* To není nic nového, má to prakticky každý jazyk, který má "battery included". Například v Pythonu 3.8 se asi dá nějak vrátit k implementaci řekněme Deque z verze 3.6, ale asi se dost věcí rozbije. Nemluvě o snaze vrátit nějakou knihovnu v Java stdlib například (zase, dá se znásilnit classloader, ale to si koleduje o problémy).
Díky za odpověď. Jakožto starý Pythonista mám tu zkušenost, že "batteries included" prostředí pro seriózní vývoj vždycky bylo poměrně nedostatečné. Některé věci se do distribuce nakonec dostanou ze zdrojů třetích stran, ale stejně člověk znovu a znovu potřebuje nějakou další knihovnu. Záleží na doméně, ve které se aplikace pohybuje, ale prostě to tak obecně je. A pak to začne být "zajímavé".
Mnohost implementací snad nemůže být zásadní problém. Po každý úspěšnější jazyk, který má jednu standardní implementaci, se brzy objeví další alternativní implementace (viz třeba Python). Kdo by preferoval vendor lock-in? Pro některá nasazení můžete chtít implementaci s komerční podporou.
Dělání věcí tisíci způsoby je spíše kulturní problém než problém jazyka. Třeba zmíněný Smalltalk je také velice tvárný metajazyk, ale o něco víc zaměřený na kulturu nástrojů, takže se programátoři většinou vyhýbají větším zběsilostem, protože by se o možnost používat tyto nástroje nad svým programem ochudili nebo si dokonce znefunkčnili vývojové prostředí.
Hm, tak konkrétně pro Python sice existuje dost alternativních implementací (IronPython, Jython, samozřejmě PyPy, RustPython, Stackless...), ale stejně se pořád bere, že CPython je "ten" Python. Vendor lock-in ve světě OSS snad nehrozí.
Jinak, co se týče "kultury jazyka", tak ano, dá se nastavit v rámci třeba firmy nebo týmu. Ale některé jazyky (a jejich komunity) tu "hravost" berou jako plus, mě to tak moc nebere (v praktické aplikaci).
CL používám jako první volbu tak kde něco řeším (třeba jednorázově) sám, ale jsou chvíle kdy si to rozmyslím, a umím si představit že někoho to otráví už při prvním setkání:
Do té doby než vznikl quicklisp byly knihovny a závislosti problém, s tím souhlas s předchozí reakcí. Teď je mnohem jednodušší knihovny získat, ale pořád - pokud chci něco specifického tak si to často musím dopsat sám (za poslední půlrok třeba alpn v ssl, nebo api na secret service). Pozitivní je že to většinou je na hranici triviality, ale některé věci bych asi psát nechtěl.
Doteď je opruz nasadit CL kód tam kde jsou jiné jazyky podporovány out of the box - Heroku se dalo, ale třeba Azure funkce bych se musel namáhat.
A taky se dvakrát rozmyslím než použiji CL řešení tam kde čekám že to bude za měsíc debuggovat někdo jiný (protože lidi).
A zatímco IDE v emacs (slynk, sly) jsou prvotřídní, tak si nejsem jistý jaký je komfort programování mimo emacs. Já jsem kvůli tomu na emacs před lety přešel, ale ne kažý chce.
Jinak díky autoru za článek, i když spousty oblastí se mohl jen dotknout. Snad jen možná není úplně vždy vidět co je vlastnost Common Lispu jako standardu, a co je sbcl specifické (třeba tvorba binárky - a mimochodem pod "překladem do nativního kódu" jsem čekal spíš výstup disassemble té faktorial funkce).
"Doteď je opruz nasadit CL kód tam kde jsou jiné jazyky podporovány out of the box"
Sice nedělám s Common Lispem, ale s jazyky, které se taky překládají do spustitelného kódu a tahají si s sebou celý runtime (Go, ale vlastně i Rust). A zrovna toto je naopak řešení, které se hodí do světa Dockeru a Kubernetes. Prostě vezmu nějakej minimální systém, ať již Alpine (to nepoužíváme) nebo ten RHtí minimal image a do toho se hodí další layer s binárkou aplikace. Nic dalšího, bo konfigurace jde přes env. var.
Neřešíme tedy, jaká verze Pythonu nebo kdovíčeho v tom imagi je, všechno aplikačně-specifické je v té jediné binárce.
Moje subjektivní hodnocení/volba - ano v IT se dost často skočí na "jednoduchém" vyřešení problému (třeba volbou v té době populárnějšího jazyka nebo řekněme operačního systému, který má pěkná vokýnka, ale jinak je to děs a hrůza), aby se nakonec řešily narovnáváky na ohýbáky, když se zjistí limity (nebo někdo jiný řekne, že jsou tam limity a donutí vás ke změně).
Simple != Easy
Jinak v profesní praxi jsme skončili u Go, protože mj. je pro daný obor dobře postaveno a navíc na to dokážu sehnat vývojáře. A když ne, tak už jsme přeučili pár Pythonistů, a to rychle. Být to v US, tak by možná i šel Common Lisp (tam má přece jen větší zastoupení na univerzitách), ale tady moc ne (mám lidi ze Španělska, Itálie, ČR/SR, UA, takže to není jen čístě ČR podivnost).
A jasně, je to jazyk s jedinou cestou, jak psát, žádné velké rozlety se nedají čekat.
Trošku OT: zrovna včera jsem se musel smát tomu, že někdo vymyslel další jazyk na zápis konfigurace (cue) s podtextem "Escape YAML hell". Takže jsme tady měli vývoj XML -> XML s ohýbáky typu podmínky a proměnné (Ant) -> JSON -> YAML -> YAML s ohýbáky typu podmínky a proměnné (v řetězcových hodnotách!) -> Cue. Kdo zůstal u s-výrazů (já používám EDN), tak toto fakt neřeší prakticky celej profesní život.
Má omluva je, že místo něj používám Typescript :-D
V tom vašem výčtu chybí dvě velmi důležité vlastnosti, které spolu volně souvisí:
1) Statické typy. Zrychlují vývoj tím, že odchytávají chyby už ve fázi kompilace, respektive s IDE už ve fázi psaní, umožňují napovídání v IDE (další zrychlení vývoje). Dělat větši refaktoring bez podpory typování musí být peklíčko. Atd.
2) Čitelnost. Pro projekty ve více lidech, případně (netriviální) takové, kdy se k programu vracíte po delší době opět kritická vlastnost. Samozřejmě jako člověk, který v LISPu nikdy pořádně nedělal mohu být zaujatý, ale ta výtka zaznívá hodně často, takže na ní něco bude. Jednak k tomu IMO moc nepřispívá prefixová notace. A pak ty závorky. Když si vezmu jednoduchý příklad z tutoriálu LISPu:
(defun fib (n)
"Return the nth Fibonacci number."
(if (< n 2)
n
(+ (fib (- n 1))
(fib (- n 2)))))
Třeba v Typescriptu by to bylo nějak takhle:
// Return the nth Fibonacci number
const fib = (n: number) => n < 2 ? n : fib(n - 1) + fib(n - 2)
TS verze obsahuje troje (jednoduché) závorky. LISP jich má celkem devatero a navic dosahuje až pětinásobného vnoření (sic!)
Plus s jazyky jako / přístupem LISPu mám tu zkušenost, že jejich zápis je poměrně elegantní, dokud člověk implementuje něco, co je "čisté matematické" řešení. Jenže reálná zadání mají "chlupy", různé specialitky, zvláštní případy, takže kód se komplikuje, není zdaleka tak elegantní a tam jsou pak tyhle jazyky naopak méně čitelné. "Klasické algolské" jazyky jsou v těchhle případech tak nějak přímočařejší a tedy ve výsledku čitelnější. (Ale tohle těžko to nějak objektivně dokazovat, je to můj subjektivní dojem.)
Common Lisp má také volitelné statické typování jako TypeScript.
Příklad s Fibbonacciho posloupností je jeden z těch, které používají hodně infixových operátorů, což pro běžný kód není typické (a tam, kde je to problém, se dá použít makro umožňující zápis infixovou notaci). Netvrdím, že Common Lisp je jazyk s nejčitelnějším zápisem (i když hodně záleží na zvyku), ale udělal zde ústupky, které mu umožňují věci jinde nemyslitelné. Dobře faktorizovaný kód bude čitelný vždy.
Standard CL definuje, jak se mají definovat nové typy a vkládat typové kontroly, nedefinuje však, jak s nimi má daná implementace zacházet. Ta je může ignorovat, používat pro optimalizace, provádět dynamické kontroly či využívat k plnohodnotné statické typové kontrole. Protože obecně, striktní statické typování bývá hodně neohrabané, tento přístup umožňuje programátorům vytvářet skutečně relevantní dynamické typové kontroly a otevírá prostor pro nástroje pro statickou analýzu pokrýt to, co je ještě teoreticky možné.
Jsou věci, které jinak než dynamicky neošetříte. Plácnu třeba: čtverec, jehož strany nepřekročí poměr 3:4; řetězec, který odpovídá určité množině formátů, datová struktura, kde některé položky omezují hodnoty jiných atd.
Nebo třeba jednoduchý číselný typ pro hodnoty 1-7 (třeba indexy dnů v týdnu). Zdaleka ne ve všech staticky typovaných jazycích můžete takový jednoduchý číselný typ vůbec vytvořit. A pokud ano, pak nad ním máte silně limitovanou množinu operací.
Ale nerad bych se tu pouštěl do diskusí o vlastnostech statické a dynamická typové kontroly. Snad jen jeden citát: I'm sure it crashed in the most type-safe way possible.
Je otázka, co má být ještě součást "typu". Je "typ YMD" (trojice čísel) zodpovědný za správné ošetření přestupného roku, tedy za řešení počtu dní v únoru? Asi ne. Na druhou stranu ale pokud jazyk dokáže vyjádřit jenom "vektor objektů" a není možno ani říct, že to je vektor celých čísel a musí se to kontrolovat dynamicky a popisovat v komentáři, je to slabé.
Určitě existují situace, které jdou řešit dynamicky lépe než staticky (mě teď z hlavy nic nenapadá, ale to nic nedokazuje). Každopádně uvedené příklady to zrovna nejsou.
Jiný problém jsou jazyky sice se statickým ale neohrabaným typováním. To je pak rozdíl mezi tím "nejde to z principu" versus "jazyk xy to nepodporuje".
V zásadě jde psaní “business” vrstvy v něčem příčetném, nabízí se Purescript, Haskell (transpiler do JS) nebo něco podobného. Vzhledem k tomu, že interop se zbytkem aplikace je v podstatě zadarmo, člověka nic nesvazuje v psaní bezpečného a stručného kódu. Výsledkem je, že se eliminuje většina jednotkových a integračních testů a všechny “runtime checks”, takže výrazně rychlejší je nejen vývoj, ale i běh kódu. Jediná potenciální nevýhoda je, že V8 nemá optimalizaci ocasní rekurze (standard ES ji předepisuje, ale implementuje ji jen Apple ve svém JS, ostatní na to kašlou), ovšem backend přehazující data v REST API na to nenarazí.
"mě teď z hlavy nic nenapadá"
Jako vazne? Nevim, jestli tu s Calculonem jen trolite nebo to myslite vazne. Obecne nejde staticky definovat ani ciselny rozah, neprazdny list, retezec rozsahu danych delek. Pokud chcete pouzivat bezne aritmeticke/retezcove/listove operace.
16. 4. 2022, 18:56 editováno autorem komentáře
> Obecne nejde staticky definovat ani ciselny rozah, neprazdny list, retezec rozsahu danych delek. Pokud chcete pouzivat bezne aritmeticke/retezcove/listove operace.
Nevím, co máš na mysli tím "obecně", ale běžně se to děje. Přece máš už teď ve všech možných jazycích 32-bitové celé číslo, máš typy s pevnou délkou (jako array v Rustu). Teď je otázka, jaké to má konsekvence:
1. Snažíme se vykonat operaci, kterou zachytí kompilátor/linter (indexování literálem mimo rozsah).
2. Bezpečná operace typu Try... - kód v runtime provede větev podle toho, zda se vejdeme do omezení.
3. Výjimka při překročení mezí.
4. Tiché překročení mezí (přetečení čísla).
Pořád je ale typ definovaný staticky a dynamické jsou "pouze" některé důsledky.
"už teď ve všech možných jazycích 32-bitové celé číslo"
ktery jazyk dokaze v case kompilace u netrivialniho programu zarucit, ze nedojde k preteceni?
"máš typy s pevnou délkou (jako array v Rustu)"
listovymi operacemi myslim operace nad poli s promennou delkou, jako filter, concatenate a podobne.
I u poli s pevnou delkou Rust casto kontroluje meze v case behu
https://stackoverflow.com/questions/47542438/does-rusts-array-bounds-checking-affect-performance
17. 4. 2022, 16:36 editováno autorem komentáře
Nás obviňuješ z trollení, a přitom sám píšeš, že
> ktery jazyk dokaze v case kompilace u netrivialniho programu zarucit, ze nedojde k preteceni?
To pak asi nemá smysl, že?
Zde jistá slečna pěkně a IMHO do mrtě rozebrala dva mýty a proč jsou to mýty.
https://lexi-lambda.github.io/blog/2020/01/19/no-dynamic-type-systems-are-not-inherently-more-open/
Jeste jednou, jak v Haskellu v case kompilace zarucis, ze vysledek aritmeticke operace nepresahne maxint?
kdyby to bylo tak jednoduche jak tvrdis, tak neexistuji veci jako https://hackage.haskell.org/package/safeint
Defines a variant of Haskell's Int type that is overflow-checked. If an overflow or arithmetic error occurs, a <b>run-time</b> exception is thrown.
Dal nebudu reagovat, nebavi me cekat dva dny na schvaleni meho prispevku.
18. 4. 2022, 01:36 editováno autorem komentáře
Já tedy nejsem odborník na typové systémy, ale je všeobecně známé, že:
https://simonmar.github.io/bib/papers/erltc.pdf
nebyl nejúspěšnější projekt.
I když v Erlangu už jsou poslední roky celkem úspěšné snahy to překonat a dotáhnout. I typové systémy samozřejmě zažívají vývoj. Jinak o Erlangu by chtělo někdy článek, nebo aspoň o https://lfe.io/, když už mám zůstat u tématu.
18. 4. 2022, 11:05 editováno autorem komentáře
Trochu to rozvedu: z pohledu standardu jsou typové deklarace slibem kompilátoru, že dané proměnné (funkce, mezivýsledky, ...) jsou daného typu, a pokud nejsou, jde o nedefinovanou situaci a může se stát cokoliv.
Ty deklarované typy mohou být od "cokoliv" přes "celé číslo" po třeba "buď NIL, nebo pole prvočísel délky 23 a libovolné šířky"; nevím co umožňuje za anotace Python takže neporovnám.
Jak se k tomu staví konkrétní implementace je na ní, a typicky také na hodnotě nastavení optimizací (což jsou taky deklarace). Konkrétně sbcl, pokud si pamatuji, postupuje podle kombinace nastavení deklarovaného safety a speed, a buď kontroluje vše, nebo zjednodušeně (např, deklaraci "celé číslo buď od -17 do -7, nebo od 7 do 17" zjednoduší na běhovou kontrolu "od -17 do 17").
Kromě toho sbcl při kompilaci sleduje typy proměnných v určité míře a varuje pokud něco "nesedí" vzhledem k deklarovaným typům a známým funkcím a operátorům. Ale všechno z té deklarace při kompilaci neověřuje.
Třeba v příkladu nahoře: nepozná jestli do pole ukládáme prvočíslo, ale pokud odvodí že přistupujeme k 24 sloupci pole, tak varuje. A příslušný kód rovnou zkompiluje jako vyvolání chyby INVALID-ARRAY-TYPE-ERROR.
Zkuste v Typescriptu s nativnim typem number (a nejakou efektivnejsi implementaci fib) spocitat fib(1000). V Common Lispu aspon dostanete spravny vysledek.
Hlavni featura (Common) Lispu jsou makra, prace s kodem jako s daty. Na takovem malem prikladu se toho moc nepredvede.
Pro zajimavost v Clojure jde (efektivne) fibonaciho posloupnost spocitat takto.
(def fibs (lazy-cat [0 1] (map +' fibs (rest fibs))))
(nth fibs 1000)
14. 4. 2022, 10:39 editováno autorem komentáře
Pretoze po nom nie je dopyt a vyvojovy ekosystem je maly. Ale je velka skoda, CLOS a defgeneric su velmi uzitocne koncepty. Nezaoberal som sa s nim dost dlho na to aby som dokazal povedat ci zatvorky su alebo nie su problem, nikdy mi nestihli vadit, ale trochu to vyvolavalo zvlastne pocity. Takisto z makier sa vie zatocit hlava, ale ako vravim, neviem ci sa to da skusenostami prekonat alebo ci vacsina programatorov je na dostatocnej urovni aby to zvladla. Podobne som to mal aj s Haskellom, na ten som nemal ani dostatocnu motivaciu.
Články od Pavla Tišnovského jsou parádní a rád se vždy dozvím něco nového. Ale teď mne někteří (možná i mnozí) ostatní čtenáři ukamenují díky mému dotazu do pléna.
A dotaz je to prostý: k čemu je jazyk Lisp dobrý? Respektive, používá to vůbec někdo? Podívám li se do tabulky používaných programovacích jazyků třeba zde https://statisticstimes.com/tech/top-computer-languages.php tak nevím, prostě žádný Lisp tam nevidím :)
Haskell se celou dobu drží ve Spojeném království, jinak asi moc ne. Ale Francouzi mají zase “svůj” OCaml a jako kuriozitu zmíním jeden obskurní jazyk (nevím, jak se jmenuje, možná ani nemá jméno) z Krakova založený na čudné (nefregovské) logice Romana Suszky (rodák z Těšínska), který vymyslel specifický logický systém pro formalizaci Wittgensteinova traktátu, načež mu v tom divní lidé začali psát programy (podobně jako když Martin-Löf vymyslel formální systém pro popis konstr. matematiky a informatici z toho k jeho nelibosti vyrobili Agdu a Coq). Ostatně i Lisp vzniknul jako čistě teoretický popis matematických funkcí a McCarthy valil bulvy (“you're confusing theory with practice, this eval is intended for reading, not for computing”), když Russell napsal interpret.
Statistiky asi neber tak vazne, treba v Tiobe indexu je, dokonce kupodivu pred Fortranem a tesne za Rustem a Kotlinem (tolik k tomu, jak brat tu statistiku vazne).
Jenze to nic moc neznamena, protoze ta statistika neni odvozovana od toho, co kdo pouziva a kolik z toho vytezi $, ale spis na zaklade dotazu a google analytics. Tj. hodne se tam vysplhalo PHP nebo VB, ale asi to uplne moc nerika o realnem nasazeni v porovnani treba s tim, co vsechno pohani Fortran.
Za me je dobry kvuli tomu, ze jsem si na lispu/scheme konecne uvedomil, jak veci funguji. Je tam blizko k AST a semantice, taky homoikonicita dost pomaha k pochopeni cinnosti interpretru i prekladacu (ale v praxi pouzivame jine jazyky ;)
Jednou za námi přišel známý a k pobavení všech znalých olbřímnosti tohoto úkolu sdělil, že má čtrnáct dní na to, aby se naučil Common Lisp + CLOS, protože začal pracovat v týmu, který ho používá. Jednalo se o systém z oblasti superpočítačů.
CL svoje přednosti ukáže nejvíce v oblastech, které se zabývají věcmi začínající prefixem meta- (přičemž mohou být stále silně praktické). Navíc, jeho alespoň pasivní znalost je nutná k pochopení některých důležitých aspektů programování (např. The Art of Metaobject Protocol).
Pokud se ho člověk detailně naučí, tak ho v ostatních jazycích asi máloco kdy překvapí (krom záliby mainstreamu v masochismu).
> Pokud se ho člověk detailně naučí, tak ho v ostatních jazycích asi máloco kdy překvapí (krom záliby mainstreamu v masochismu).
Není tohle zastaralý mýtus? Mně přijde, že v APL/J/K, Haskellu a jiných jazycích je dost konceptů, které okolo CL ani nešly. Silný typový systém jsme koneckonců nakousli a to zrovna asi taky nebude "reinvented Lisp" a o masochismu bych taky nemluvil.
Já myslím že to mýtus není. Ale těžko se to asi dokazuje. Přidám třeba zajímavé projekty co jedou na CL.
- https://www.grammarly.com/blog/engineering/running-lisp-in-production/
- https://www.youtube.com/watch?v=mbdXeRBbgDM
Az doteraz som si myslel, ze ten Fortress mal byt nejakym revolucnym vylepsenim Fortranu. Ale ked na to pozeram teraz, tak Fortran vs Fortress mi pripada ako Pascal vs Ada, alebo Java vs Scala. Myslim, ze sa netreba divit, preco sa ten jazyk dalej nevyvijal - asi by sa nenaslo moc ludi, ktori by v tom chceli programovat.
Mam takovy dotaz, na tenhle clanek jsem narazil nahodou, marne hledam na netu a nechce se mi cely cist ..... respektive nechce se mi cist cely sto-dilny serial. Ale jak ctu takove veci jako Rust, Julia nebo Lisp ..... nutne cloveku vytane na mysl, proboha proc? K cemu? K cemu by neco takoveho mohlo byt dobre? Co se tim programuje? Kde je nejake realne nasazeni a vyuziti?
Priznam se, ze v dobe, kdy mame fakticke etalony v podobe nejpozivanejsich a univerzalnich prakticky na vsechno typu C#/JAVA jinymi slovy s C++ syntaxi, hardcore na opravdu low-level jako C nebo "detske" jazyky idealni pro zavedeni si extremne spatnych programovacich navyku jako treba Python a pak specialni typu SQL ..... ale k cemu je proboha jako LISP?:o) Jako da se v LISPu naprogramovat nejaka aplikace? Kde bezi? Jakoze nejaka elektrarna nebo co? Delaji se v tom specialni firmwary? To dost pochybuju. Unika mi jejich vyznam, krom historicke zminky. A neberte to ironicky, vzhledem k tomu, ze jsem tu nasel desitky (mozna stovky) velmi revrubnych clanku o LISPu, Rustu, Julia a patrne dalsich "podivnostech", tak me fakt zajima, jestli je autor masochista, ze pise o desitky let mrtvych vecech nebo to fakt k necemu je.
Asi je to častá otázka, i když netuším proč. Poslední pokus o odpověď co jsem potkal viz https://lisp-journey.gitlab.io/who/ a odkazane linky.
A co jsem párkrát viděl je prototyp v Lispu, a po finalizaci produktu přepis do "mainstreamového" jazyka (Reddit -> python a pod.)
Nemohu se ubranit vnitrniho dojmu, ze kdyz se rekne LISP, znamena to neco podobneho jako kdyz se rekne LOTUS ..... proste dekady mrtva vec. A ano, i Lotusove databaze stale nekde bezi (jako vtipnou pripominku totalniho diletantstvi zminme treba FN Brno), ale to je prece nedela relevantnimi nebo jakkoliv zajimavymi. Jako chapu, ze v tom jde napsat hello world ..... ale jde v tom napsat i neco jineho? A hlavne, jde nejakym zpusobem o zajimavou vec? Ve smyslu, ze neexistuje lepsi alternativa v podobe moderniho jazyka a modernich nastroju? Pokud je to nekde v letadle nebo v druzici, chapu, ze dva lidi na svete to mozna jeste musi nejak ovladat (autor clanku je asi jednim z nich). Ale ma to jakoukoliv relevanci z hlediska moderni doby? Jakoze kdyz budu premyslet, v cem udelam aplikaci, ze by lisp mohl byt jednou z variant (a tim nemyslim, ze by nebyl uplne na konci, ale jakoze ho vubec brat v potaz)? Proste me nenapada JEDINY duvod dnes nasazovat nekde Lotus:o) Teda jeden velmi relevantni duvod asi bude a to bude platit i o Lispu ..... vendor lock ..... nebo spis developer lock:) Pokud v tom napisu kus kodu, ktery by nejak fungoval a byl pro firmu prospesny, tak ma clovek vystarano se zamestnanim, protoze tomu nikdo nebude rozumet a jineho Lisp vyvojare nikdy nikdo uz nesezene:o)
No, priznam se, ze me to zacalo dost zajimat a cim vic to ctu, tak nejde o samotny jazyk ve kterem by slo realne neco udelat. Od dob velkych frameworku by to bylo dost velka zoufalost. Ale ze je to proste jakoze doplnek k velkym frameworkum jako .NET, JAVA, kdy to k necemu muze slouzit. Osobne delam ETL v .NETu, protoze poskytuje vybornou podporu pro multiplatformni aplikace (fakticky i binarne shodny kod pro linux a windows) a hlavne je pekelne rychly a vytvari POSIXove binarky, takze nepotrebuje zadne zavislosti a jiny "linux-typical" bordel a svinstvo. A tak si rikam, jestli by se mi to nemohlo k necemu hodit ten clojure. Jako jestli ..... a ted fakt nevim, protoze posledni C# standard obsahuje snad vsechno myslitelne a bohuzel i nemyslitelne, takze zacina PERLit, coz me dost stve, protoze kod se diky tomu, ze lze delat ruzne zapisy pro "zjednoduseni", zacina byt cim dal hure citelny. Ale to jsem odbehl. Proste by me zajimalo, jestli ma Clojure co nabidnout jako doplnek k C#, ve smyslu nejake super-duper konstrukce, kde bych si zjednodusil praci, kdybych to zacal nejak pouzivat. Vidim, ze v nugetu je nejaka 16 hodin stara verze, tak to asi neni vyslovene mrtve:o)
Ja furt nevim, jestli se jedna o nejakou promyslenou legraci a delate si ze me srandu. Jako beznym hledanim veci jako LISP, CLOJURE atd. jsem v IT nenasel JEDINOU pozici. Nejenom, ze nikoho neznam, ale nikdy jsem ani neslysel o cloveku, co by v tom programoval. Takze kvantifikace "dost velky typ aplikaci" me opravdu na prdel neposadi ..... ptal jsem se JAKE?
Ja par lidi z Clojure znam. A vydelavaji hodne https://insights.stackoverflow.com/survey/2021#section-salary-salary-and-experience-by-language
(neni to samozrejme uplnej mainstream, ale to je ostatne pochopitelne - Gaussova krivka i tady funguje)
Priznam se, ze co me hned zaralilo je to, jak je tam vice vydelavajici bash "vyvojar" nez treba u Cecka (cili Javy atd.). Jakoze v bashi samozrejme nikdo nejake desetiradkove skripty nevyrabi jako full time. A urcite nikoho neplati vic nez uklizecku za znalost tech cca peti prikazu:o) Jako je to rozsahly popis, nechce se mi to vsecko cist, ale hned me zarazil pocet tech manazeru v pruzkumu.
LISP konkrétně nepoužívám, protože vyžaduju statické typování.
Ve všech svých projektech používám tyto jazyky:
Rust pro všechno svého, co má běžet zajímavě rychle (dříve jsem používal Haskell, ještě dříve C++).
Lua v případě nějakých dynamických podivností, ale postupně to opouštím.
PHP, Javascript na web, protože low-end hosting.
C#/Java/Python/PHP - když v tom má klient nějakou legacy věc (prostě práce pro peníze).
Proč nepoužívám C#/Java jako hlavní jazyky? Protože jsou blbé. Nedostatečný typový systém, ukecaná konzervativní syntaxe, runtime (studenej start). Když bych vážně uvažoval nad JVM, tak bych zkusil Kotlin, nebo Scalu, protože přidávají moderní vlastnosti v podobě lepších typů a syntaxe (zvláště ta Scala).
C++ nepoužívám, protože to v porovnání s Rustem je už zbytečné/neekonomické trápení. Přináší tolik zásadních výhod, že C++ je pro mě prostě mrtvá záležitost.
Tak ja hlavne C# (.NET), protoze ma obrovskou podporu, obrovsky framework (mozna nejvetsi), prijemne IDE, bezi bez nejakych zavislosti, rychly fakticky jako C++ (proto treba vyslovene nemam rad obskurnosti s JVM). A hlavne oproti C++ je "bezpecny", clovek nemusi resit resourcy atd. No, pak jeste trochu Python, protoze se ve firme pouziva, ale Python povazuju za novodoby mor, lidem akorat vnucuje spatne navyky a navic je to jazyk zcela na dve veci, pomaly jak cyp, protoze interpretovany, dynamicky typovany, coz je asi uplne nejvetsi zlo, co mohl kdy kdo vymyslet. Mel smysl tak pred 15ti lety, kdyz nebyl .NET Core a clovek potreboval neco v linuxu a nechtelo se mu votravovat s C++.
Nevim co beres jak nedostatecny typovy system:) Jak uz jsem psal, C# se (bohuzel) dost poperluje, takze tam jde delat vsechno (viz LINQ, coz povazuju za zrudnost) celkem jakoze jednoduse, vicevlaknove veci velice snadno, OOP, proste co si clovek vzpomene. Ale hlavne jazyk je tak silny jako komunita/framework .... pokud ma slaby framework, tak je to konecna. Pokud nema treba klienta pro DB a podobne, tak to muze byt skvely jazyk, ale ......
> Nevim co beres jak nedostatecny typovy system:) Jak uz jsem psal, C# ...
Buďme konkrétní.
1/ Chtěl bych vytvořit Enum, který má tři položky OK, Fail, FailWith(string). V Rustu, Haskellu, a dalších jazycích to je samozřejmost.
2/ Chtěl bych vytvořit funkci, která přijme hodnotu třídy Foo a nepřipustí Null. Jsem ochoten zkousnout, že mi to hodí runtime výjimku. (Snad v .NET 8) Nepřeložitelnost by samozřejmě bylo lepší (v jiných jazycích běžná věc).
3/ Chtěl bych, aby když udělám Enum, a dám tam switch, tak mě to upozornilo, že jsem nepoužil všechny varianty (v jiných jazycích běžná věc).
4/ Chtěl bych, aby když udělám metodu, která přijímá Potomka : Předka, tak dostala přednost před metodou, která přijímá Předka.
5/ Chtěl bych, aby u moderního jazyka se nepoužívali ve všech knihovnách a FW anemické objekty jako default a dokonce pro to byla syntaxe.
6/ Chtěl bych, aby to nešlo přeložit, když se změní signatura třídy knihovny, kterou používá knihovna, kterou používám.
A tak dále.
Tohle jsou takové ty trivialitky, které považuji za samozřejmost, a které C# deklasuje.
Samozřejmě beru, že kolegové v MS udělali s .NET ohromný kus práce. Je za tím ohromná komunita a vůbec. Nic to nemění na mém závěru, že je to bastl, který umí spoustu cinkrlátek, ale zásadní (typové) featury to nemá. Prostě zaspal dobu a můžou si s Go podat ruce.
Pises o enumu jako o necem posvatnem nebo mi prijde, ze nevis k cemu je enum. Jestli jsem to ad1) pochopil spravne, tak bys snad enumem chtel predavat nejakou hodnotu? Proto ten string v zavorce? Nebo to chapu spatne? Od toho snad neni enum ne? Ad2), od toho jsou nullable a non-nullable typy ne? Ad3), jako kam chces cpat jakysi switch? A pokud to chapu spravne, tak jen chyba programatora na kterou mozna upozorni compiler, pokud to nekdo povazoval za nutne, ale urcite ne jako warning, mozna jako tip/suggestion, kterych jsou po napsani par radku kodu, vzdycky tak desitky, aspon u me:o)
Ad4) to je snad dano jasne danymi OOP pravidly a pokud to chces nahodou jinak, tak to udelas jinak, nechapu problem.
Ad5) netusim o cem je rec. Ad6) opet zalezitost co potrebujes, tak pokud mas knihovnu a nedefinujes presne verzi, tak proc by to nemelo jit prelozit? To je naopak zadana vlastnost ne? A pokud ji zmenis, nemas ji podepsanou nebo nezmenis cislo verze, tak to prece nesouvisi s jazykem, ani nicim jinym. To je asi jako nadavat na textovy editor, protoze jiny proces mu muze smazat editovany soubor ...... je to proste vlastnost a pokud tomu chces predejit, tak to musis proste zaridit.
ad 1/ Přesně tak. V Haskelu, Rustu a dalších moderních jazycích je spojen bod 1 a bod 3 v elegantní symbióze. Můžeš si to představit jako speciální konstruktory v C#. Až na to, že ty konstruktory jsou sice stejného typu, ale různé variantě (instance) typu. A díky tomu se dají perfektně podchytit všechny strategie a na žádnou nezapomenout. Díky tomu, že metody/funkce mohou přijímat buď konkrétní typ, nebo jen konkrétní instanci toho typu, tak to opět hodně pomáhá.
ad 2/ ne, protože to nefunguje C# to (do verze 8 snad?) neumí.
ad 4/ neudělám to jinak, protože to nejde. Musím udělat jednu metodu a v ní pomocí instanceof větvit. Ne, že by to byla taková katastrofa, ale ve spojení s bodem 2 to je dost trapný.
ad 5/ to nevadí.
ad 6/ protože to zbuchne na produkci, páč tam zmizela metoda
Jako přeložit kód, kdy volám metodu, o které vím, že neexistuje, to ti od jazyka přijde v pořádku? (Nebavíme se o dynamic-dispatch, a pod prosím.)
Závěrem: Chtěl jsi vysvětlit, proč nám C#/Java nestačí. Tož tady to máš. Ber nebo nech být. Prostě mám určité požadavky, jsem trochu zmlsaný, a navíc v dnešní době si to mohu dovolit. Ty žiješ ve své bublině, až tak, že si nedovedeš představit, že by to mohlo být jinak. Můžeš se mnou nesouhlasit, můžeš si myslet, že problém je na mojí straně, nech sa páčí. Já jen uvedl pár příkladů, které mě teď z patra napadli a které mě schází. Asi bych našel i další. Určitě se ale nebudu o své pravdě přetahovat.
No jako ono C# v posledni veci umi spoustu novinek, jako ja jsem uhnil na verzi nekde pred 10ti lety, jako jsou veci dobre a uzitecne jako treba nulovatelne typy, ale zase veci kdy se da "zjednodusit" zapis ala PERL, tak to povazuju za mor, protoze to zcela zbytecne zneprehlednuje kod ..... jako ze zjednoduseni bych ponechal maximalne ++, pripadne --, ale kdyz jsou pak kombinace =+ nebo +=, kdo tomu ma jako rozumnet, co ktery znamena. A kdyz pak novy C# umoznuje zapisovat novou instanci jen jako new(), misto new Funkce(), tak se muze zdat, ze jde o malickost, zjednoduseni, ale kdo to vidi poprve, jako ja nekdy pred 14ti dny, tak je to jen uplne zbytecna picovina.
Ale zpet k veci, ja ti to neberu, proto je tu prave ta diskuze, me zajimalo, co treba ten Ruste nebo Lisp muze prinest .... jako jedna vec je ten programovaci jazyk a druha je framework, coz je dneska IMHO mnohem dulezitejsi a je to vlastne alfaomega dnesniho programovani. Muzes mit sice super duper jazyk, ale pokud nema ovladac pro tvoji databazi nebo pokud pro stazeni souboru z netu musis napsat kompletniho klienta jak v cecku pred 20ti lety, tak je to dost o nicem:) A treba takovy .NET ma patrne nejvetsi repositar ze vsech. Mozna jeste muze konkurovat JAVA, ale tam nevim jak to chodi, jestli maji neco jako Nuget, cili jednotne misto nebo je to rozbite mezi milion konkurencnich projektu. To i takovy detsky Python ma nejakou jakstaks udrzovanou repozitar, byt teda Python bych asi ani radeji nezminoval, protoze to je opravdu mor dnesni doby .....
"frameworkem" je zde myšlen ekosystém knihoven okolo jazyka, nebo nějaký konkrétní nástroj/technologie typu (řekněme) RoR?
Pokud jsou myšleny knihovny, tak například ty vybrané jsou zde https://github.com/razum2um/awesome-clojure a https://awesome-rust.com/ popř. ještě pro Clojure https://www.clojure-toolbox.com/
(btw celkový počet dostupných balíčků asi moc nemusíme porovnávat, tam to vyhraje hnůj v NPM. O použitelnosti v reálných - neřkuli produkčních - programech počet balíčků neříká vůbec nic, samozřejmě IMHO)
C# je brutálně pragmatický jazyk cílící na lidi, kteří původně dělali v Javě a v C++. Takže se od něho očekává nějaká ta dědičnost, anotace, a property byla velká sláva, na které demonstrovali jeho coolovitost. Požadavky, aby se programátor musel učit nové koncepty nebyli jeho cílem.
Aby si pochopil můj úhel pohledu, psal jsi:
> A pokud to chapu spravne, tak jen chyba programatora na kterou mozna upozorni compiler, pokud to nekdo povazoval za nutne, ale urcite ne jako warning, mozna jako tip/suggestion, kterych jsou po napsani par radku kodu,
Tohle je u mě přesně jinak. Mám problém který chci vyřešit pomocí nějakého jazyka. A chci, aby mi ten jazyk maximálně pomáhal. Fakt nejsem zvědavej na takové: "no na to jsi měl myslet", "to je starost programátora". Ať ten jazyk dělá co nejvíc. Ať mě vede za ručičku. Ať mi nedovolí udělat chybu. (Stejně ho přečůrám.)
Tak ta filozofie není nic nového, že. Je vidět na mnoha místech, třeba i na takovém prachsprosém SQL - "Prosím tě, nic nevymejšlej. Jen mi řekni, co chceš.".
Pak je ještě ten problém, že často musím řešiš kompromisy. Rychlost, kolegy, komunita,... Dřív jsem si myslel, že ten ideální kompromis je Haskell. Nyní používám Rust. Agda, nebo Idris je pro mě (zatím) neprozkoumaná oblast.
Jako uz jsem slysel spoustu nazoru (a ja s tim 100% souhlasim), ze pythonem se zacina vsude, jakozto jednoduchym jazykem, ale akorat to svadi si udelat vyslovene spatne programovaci navyky a vlastne nic se nenaucit. Python mel IMHO vyznam pred 15ti lety, kdyz mel framework stylu, ze kdyz chtel clovek stahnout neco z webu, nemusel pul dne programovat nejaky lowlevel inteface a hlavne, ze byl multiplatformni. Jinak je to samozrejme stale oneman show, kdy se dejou takove zasahy do zpetne kompatibility, ze clovek fakt jenom zira (naposled mi 15 let stary skript shodil interpreter - coz je taky vyborna vlastnost - kdyz Popen zmenil vystup stderr z str na stream z duvodu, ktery se asi da jen tezko hlavou pochopit). Treba takovy print a pridana nutnost zavorek, kdyz ANO, samozrejme je to logicke, ale klidne mohlo v ramci kompatibility zustat puvodni ...... jako python je peklo, wotomzadna! A vyslovene nebezpecne je grupovani pomoci tabulatoru a/nebo mezer .... kdy uz samo o sobe je to proste nebezpecne, ale kdyz umoznuje kombinaci tabulatoru a mezer v jednom souboru, tak to uz je opravdu genialni vlastnost, kterou taky nevymyslis:o)
Takze pred 15ti lety jsem to pouzival protoze to jelo na linuxu pro ruzne instalace, protoze pouziti bashe na vic jak 10 radku (respektive obludnost jako bash vubec pouzivat) je totalni silenstvi. Jako python ma mozna i dnes nejake opodstatneni pro skripty do 100 radku jako nahrada bashe, protoze python je vetsinou vsude .... ale kdyz clovek zacne pouzivat balicky, tak je vetsinou stejne v pasti, protoze na serverech tezko nekdo dovoli pristup k netu a mnohe balicky potrebujou kompilovat pro instalaci, takze nestaci prenest jen site-packages, no hruza. Proto jsem si hodne oblibil .NET core, protoze nema zadne zavislosti, bezi na posixu, cili na uplne nejnizsich konfiguracich nativne bez zhovadilych zavislosti, proste zkompiluju a jede to i na serveru, co nema pristup k netu. A jestli se treba takove MAUI ukaze byt tim, co tvrdi, cili bude mit i vlastni xserver (nikdy nepochopim, proc jeste nekdo neudelal xserver jako jedinou klihovnu bez jakekoliv zavislosti), tak bude mozne delat i graficke aplikace bez zhovadilosti. Libi se mi proste, ze to bezi nativne ve vsech OS, ma to obrovsky framework, obrovskou podporu, komunitu ... jak je nejaky ten pruzkum jazyku, tak C# mel byt jazyk roku 2021, ale predbehl ho opet python z nejakeho nepochopitelneho duvodu, zajimalo by me jak to pocitaji. Znam asi stejny pocet "opravdovych" aplikaci v pythonu jako pro lisp:o) Jako IMHO, pokud se tim clovek chce zivit a delat multiplatformni aplikace, jakoze skutecne aplikace, ne jenom nejake jednoduche skripty, tak to dnes bude JAVA nebo C#. Nerikam, na nejake speciality, se jiste muze hodit neco jineho/obskurniho:), ale general purpose jazyky jsou dnes celkem jasne.
Me na Pythonu neprijde nic elegantniho. Z principu toho, ze je to dynamicky typovany jazyk, tak je jednak silene pomaly a jednak fakticky nebezpecny a o nejakem OOP si muze tim padem nechat jen zdat. Ale asi nejvetsi katastrofa je, ze neni pouzitelne zadne IDE, protoze nenabizi spravne metody, kdyz nevi, co je to za typ. Vim, ze kdysi byla dokonce nejaka snaha explicitne typy definovat, ale myslim, ze to furt python neumi. A cisty a elegantni, kdyz umoznuje zapis v jednom souboru jak s mezerama, tak s tabulatorama, tak ma do cistoty hodne daleko. No a to ani nezminuju naprosto tristni neexistenci zpetne kompatibility, kdyz se nekde neco obcas proste vykydne. A nekonzistence jako zjistovani velikosti objektu jednou pomoci LEN, podruhe vnitrni metodou me uz nechavaji chladnym. Nekdo rika, ze je to snadny jazyk, ja rikam, ze pokud clovek chce jenom neobjektovy a zcela straight forward kod, tak jej napise uplne stejne v nejakem "C" jazyku, syntaxi se lisi, ale learning-curve je uplne stejna, navic navyky a syntaxi "C" pouziva spousta dalsich jazyku. No a tim, ze kdyz je dynamicky typovany a chci vedet jake metody ma treba takovy "file", tak musim na google, misto napsat tecku a IDE nabidne vsechny moznosti vcetne nejbeznejsich a jejich popisu, tak je to vlastne extremne neprijemny jazyk na programovani. S odstupem casu nemuzu prijit na jedinou vyhodu pythonu oproti cemukoliv jinemu ..... mozna proti bashi:o)
Python uz par let ma typove anotace, rekl bych typovy system v mnoha ohledech mocnejsi nez C#. Strukturalni typy, jednoduche zavislostni typy, celociselne generiky.
Ne vsude se to pouziva, ale vetsina opensource projektu to pouziva.
Netvrdim, ze Python je dokonaly, ale podle me jeho kritici ho casto neznaji a neumi spravne pouzivat. Muze za to castecne povest jednoduche ho jazyka.
"No a tim, ze kdyz je dynamicky typovany a chci vedet jake metody ma treba takovy "file", tak musim na google, misto napsat tecku a IDE nabidne vsechny moznosti vcetne nejbeznejsich a jejich popisu"
To neni pravda, zkuste ve vscode napsat open('neco).
20. 4. 2022, 22:06 editováno autorem komentáře
Tabulatory dnes nikdo nepouziva, staci soubor preformatovat "blackem". Vsichni dnes pouzivaji automaticke formatovace a lintery v CI, pres ktere tabulatory neprojdou.
K OOP, rekl bych ze v mnoha ohledech mocnejsi a flexibilnejsi nez v C#. Jestli je to dobre, je otazka. Dava vic moznosti autorum knihoven, ale nektere featury jako metaclassy je asi lepsi v aplikacnim kodu nepouzivat. V dobre otestovanych knihovnach, proc ne.
Prostě další validace v runtime: takové dynamické design-by-contract.
Z těch Ada likejazyků je třeba Eiffel moc pěkný... škoda že to kutí
stále skoro komerčně. Ten jazyk pomřel kvůli politice. Patnáct let zpět jsem nad Eiffelem a Adou trávil pěkné večery a říkal si proč tohle nikdo nepoužívá? :D (to jsem o funkcionálních jazycích ještě skoro nic nevěděl)
Pisu jednoduche zavislostni typy, je mozne napriklad odvodit navratovy typ z hodnoty parametru. To umi i Typescript. Jsi stejny ignorant jako Lojza, ten si aspon nehraje na intelektuala. Kdyz chces machrovat s ezoterickymi jazyky, nauc se nejdriv hlavni proud.
21. 4. 2022, 13:42 editováno autorem komentáře
Zde autor - masochista :)
Jako vývojář, který profesně (tedy za peníze) už vystřídal přibližně deset programovacích jazyků (viz * a **) si víc a víc myslím, že nakonec hlavní důvod "proč LISP" velmi pěkně shrnul Thomas Kuhn:
Paradigm in science not only affects the way you look at the world but it affects the way you can look at the world.
K tomu je vhodné jen dodat, že LISP (tedy i Common Lisp) je nejenom multiparadigmatický jazyk, ale navíc se mnoho (většina?) paradigmat nejprve vyzkoušela právě v Lispu (důvody - homoikonicita, makra, manipulace s AST).
* pracoval jsem i v Clojure, to byla asi nejlepší zkušenost vůbec. Už jen kvůli komunitě okolo Clojure - naprostá většina těch lidí byla/je daleko přede mnou, takže člověk nezakrněl
** mnoho míst okolo Clojure/Lispu se nenabízí přes Linked In, resp. někdy nabízí, ale cesta k nim je krkolomnější... to je na delší povídání a toto vlákno se pro to vůbec nehodí