Problémy s JavaScript v praxi

andy

Re:Problémy s JavaScript v praxi
« Odpověď #525 kdy: 10. 10. 2018, 08:42:23 »
Citace
V Haskellu (i v tom C++) při běhu hodnoty ten tag neobsahují
I když teď mě napadá, že pokud nevypneš RTTI, tak to v tom C++ vlastně runtime někde k dispozici je...


Bacsa

Re:Problémy s JavaScript v praxi
« Odpověď #526 kdy: 10. 10. 2018, 08:44:32 »
Citace
V Haskellu (i v tom C++) při běhu hodnoty ten tag neobsahují
I když teď mě napadá, že pokud nevypneš RTTI, tak to v tom C++ vlastně runtime někde k dispozici je...
Jen u virtuálních tříd.

v

Re:Problémy s JavaScript v praxi
« Odpověď #527 kdy: 10. 10. 2018, 08:59:56 »
eee: když si definuju tohle:
Kód: [Vybrat]
data Value = VInt Int | VDouble Double | VStrint Text | VBool Boolean | VObject (Dict Text Value) | VNone
-- Čti: Typ Value může nabývat hodnot "VInt s parametrem celé číslo", "VDouble s parametrem double" etc.
-- To VInt, VDouble je de-fakto "tag"
Tak to je přesně ten typ, který se používá v JS, Pythonu etc. Všechny funkce potom budou typu ve stylu:
já myslím, že to tomu chybí reference/identita objektu

andy

Re:Problémy s JavaScript v praxi
« Odpověď #528 kdy: 10. 10. 2018, 10:12:25 »
eee: když si definuju tohle:
Kód: [Vybrat]
data Value = VInt Int | VDouble Double | VStrint Text | VBool Boolean | VObject (Dict Text Value) | VNone
-- Čti: Typ Value může nabývat hodnot "VInt s parametrem celé číslo", "VDouble s parametrem double" etc.
-- To VInt, VDouble je de-fakto "tag"
Tak to je přesně ten typ, který se používá v JS, Pythonu etc. Všechny funkce potom budou typu ve stylu:
já myslím, že to tomu chybí reference/identita objektu
object.__class__? (teda pomíjím, že to není mutable, ale to myslím není předmětem diskuze)

Bacsa

Re:Problémy s JavaScript v praxi
« Odpověď #529 kdy: 10. 10. 2018, 11:05:00 »
eee: když si definuju tohle:
Kód: [Vybrat]
data Value = VInt Int | VDouble Double | VStrint Text | VBool Boolean | VObject (Dict Text Value) | VNone
-- Čti: Typ Value může nabývat hodnot "VInt s parametrem celé číslo", "VDouble s parametrem double" etc.
-- To VInt, VDouble je de-fakto "tag"
Tak to je přesně ten typ, který se používá v JS, Pythonu etc. Všechny funkce potom budou typu ve stylu:
já myslím, že to tomu chybí reference/identita objektu
Ta je ale k ničemu.


oss

Re:Problémy s JavaScript v praxi
« Odpověď #530 kdy: 10. 10. 2018, 11:59:19 »
Ako sa s temy o PHP stala tema o Haskelly?

eee

Re:Problémy s JavaScript v praxi
« Odpověď #531 kdy: 10. 10. 2018, 14:36:02 »
Citace
Pořád máš divnou terminologii. Nechápu, proč ji používáš. Shodnem se na tom, že číslo a string jsou různé datové typy? Ano, když sečtu číslo a string, tak to spadne na type error, proto mi není jasné, proč to označuješ za varianty jednoho datového typu. To jsou hodnoty různých datových typů. Na základě čeho to spadne u tebe, když to považuješ za jeden datový typ?
No úplně právě neshodneme. V dynamických jazycích jsou číslo a string vlastně stejný datový typ ("JSValue"), protože ty můžeš zavolat "3 + '6'" - a normálně se to zavolá. A pak někde v tom __add__ se to zkontroluje a případně spadne. Ty přece klidně můžeš sečíst 2 různé třídy a __add__se normálně zavolá, zkus si to, nikde tam k žádné kontrole nedochází. Typy jsou právě statická záležitost....
Nutíš mě zopakovat, co už jsem jednou napsal.

Implementace není podstatná, důležité je, jakou abstrakci ti to poskytuje na venek.

Tohle je pochopení, které ti chybí. Ty se nezabýváš vlastním jazykem, ale jeho implementací, a to je chybný přístup. Jazyk je jeho vnější abstrakce, kterou poskytuje programátorovi a na této úrovni se s nim zachází.

Chápej, i statické typy jsou jen vrstva abstrakce nad reálnými daty. Reálná data v paměti jsou jen jedničky a nuly organizované a adresované po bajtech, nic víc, nic míň. Všechno nad tím je abstrakce, kterou ti prg. jazyk nad těmito daty poskytuje. Dynamické jazyky jsou implementované ve statických, a to je to, co tě mate a brání ti uvažovat o dynamickém jazyku o level výš, na jeho úrovni abstrakce.

Datový typ není nic jiného, než definice/informace o těchto reálných datech v paměti, která specifikuje, jak s nimi zacházet. A to platí jak pro statické, tak dynamické jazky, akorát ty dynamické jazyky jsou tlustší o jednu (interpretační) úroveň. Platí, že data jsou nějak reálně uložena v paměti a prg. jazyk programátorovi umožňuje s nimi nějakým definovaným způsobem zacházet. Jakým způsobem to dělá je jeho interní záležitost.

Proto datové typy má i dynamický jazyk a neoznačují se tag, ale typ. V Pythonu máš datové typy a zjišťuješ je funkcí type(), nikoliv tag(), stejně tak to má Lua, obdobně v JS máš typeof nebo v php zase gettype() a tak dále. Snažit se to předefinovat je marná a hoavně hloupá snaha, která tě vede k nesmyslnému tvrzení, že číslo a string je v Pythonu ten samý datový typ.

andy

Re:Problémy s JavaScript v praxi
« Odpověď #532 kdy: 10. 10. 2018, 14:48:03 »
Implementace není podstatná, důležité je, jakou abstrakci ti to poskytuje na venek.
Souhlas. Sbstrakce, které poskytuje dynamický jazyk, jsou "zjištění tagu" (type, instanceof), volání funkcí (lze poslat jakoukoliv hodnotu dovnitř, můžeš dostat cokoliv ven). Což je identické ve statickém jazyku součtovému typu JSValue.

Citace
Chápej, i statické typy jsou jen vrstva abstrakce nad reálnými daty. Reálná data v paměti jsou jen jedničky a nuly organizované a adresované po bajtech, nic víc, nic míň. Všechno nad tím je abstrakce, kterou ti prg. jazyk nad těmito daty poskytuje. Dynamické jazyky jsou implementované ve statických, a to je to, co tě mate a brání ti uvažovat o dynamickém jazyku o level výš, na jeho úrovni abstrakce.
Abstrakci, kterou dynamický jazyk poskyuje, je (v oblasti té "flexibility", kvůli které o tom mluvíme) ekvivalentní abstrakci JSValue, kterou jsem tady uvedl.

Citace
Datový typ není nic jiného, než definice/informace o těchto reálných datech v paměti, která specifikuje, jak s nimi zacházet.
Mám tendenci s tímhle nesouhlasit (paměť je jen implementační detail). Co kdybys toho Pierce přečet (stačí prvních pár kapitol) a pak se k tomu zkusil vyjádřit? Tady to je online: https://www.asc.ohio-state.edu/pollard.4/type/books/pierce-tpl.pdf Je to docela eye-opening....

Citace
Proto datové typy má i dynamický jazyk a neoznačují se tag, ale typ. V Pythonu máš datové typy a zjišťuješ je funkcí type(), nikoliv tag(), stejně tak to má Lua, obdobně v JS máš typeof nebo v php zase gettype() a tak dále. Snažit se to předefinovat je marná a hoavně hloupá snaha, která tě vede k nesmyslnému tvrzení, že číslo a string je v Pythonu ten samý datový typ.
Takže to není "tag", ale "typ", protože ta funkce se jmenuje "type" a ne "tag". A kdyby to autoři jazyka nazvali "tag", tak by to nebyl typ, ale tag....  eh... nedostává se mi slov...

Ano, číslo a string je v pythonu jiná hodnota toho samého součtového typu (pokud tam nejsou type anotace). Pokud s tím nesouhlasíš, tak si nejdřív přečti začátek toho Pierce a pak to svoje tvrzení zkus nějak obhájit. V tomto pořadí, ne opačně.

eee

Re:Problémy s JavaScript v praxi
« Odpověď #533 kdy: 10. 10. 2018, 14:50:19 »
Ještě se koukni na tu citaci předtím - typy se řeší staticky. Pokud nejsi schopen ty typy řešit staticky, ale až runtime, tak už se tomu tak úplně neříká typ, ale třeba "tag". Python je naimplementovaný podobně jako ten příklad v C. A všechny ty funkce vrací JSValue (PyValue?? už jsem to API dlouho neviděl).
Datové typy jsou implementovány různě a pořád se tomu říká datový typ, rozhlédni se někdy kolem sebe. Pořád se na to nedovedeš podívat na dynamický jazyk z vyššího nadhledu, než je implementace interpretu ve statickém jazyce. Máš omezené chápání datového typu jako formátu bytů v paměti, jako datový typ proměnné, tak jak s nimi zachází statické jazyky. Datové typy ale mají vyšší principiální význam, označují i druh/význam dat. A mohou být integrální součástí hodnoty, nikoláv proměnné. Tuto jejich vyšší funkci přehlížíš.

andy

Re:Problémy s JavaScript v praxi
« Odpověď #534 kdy: 10. 10. 2018, 15:19:35 »
Ještě se koukni na tu citaci předtím - typy se řeší staticky. Pokud nejsi schopen ty typy řešit staticky, ale až runtime, tak už se tomu tak úplně neříká typ, ale třeba "tag". Python je naimplementovaný podobně jako ten příklad v C. A všechny ty funkce vrací JSValue (PyValue?? už jsem to API dlouho neviděl).
Datové typy jsou implementovány různě a pořád se tomu říká datový typ, rozhlédni se někdy kolem sebe. Pořád se na to nedovedeš podívat na dynamický jazyk z vyššího nadhledu, než je implementace interpretu ve statickém jazyce.
Už sis toho Pierce přečet?

Citace
Máš omezené chápání datového typu jako formátu bytů v paměti, jako datový typ proměnné, tak jak s nimi zachází statické jazyky.
Ehm... tos ale před chvílí říkal ty...?
Citace: andy
Citace: eee
Datový typ není nic jiného, než definice/informace o těchto reálných datech v paměti, která specifikuje, jak s nimi zacházet.
Mám tendenci s tímhle nesouhlasit
???

Citace
Datové typy ale mají vyšší principiální význam, označují i druh/význam dat. A mohou být integrální součástí hodnoty, nikoláv proměnné. Tuto jejich vyšší funkci přehlížíš.
Ehm podruhé.... už sis přečet toho Pierce? Znáš tohle? https://cs.wikipedia.org/wiki/Dunning%C5%AFv%E2%80%93Kruger%C5%AFv_efekt To nemíním jako urážku, ale myslím si, že po přečtení prvních pár kapitol změníš názor... (bohužel rychločtení u tohodle nefunguje)

andy

Re:Problémy s JavaScript v praxi
« Odpověď #535 kdy: 10. 10. 2018, 15:26:50 »
Nicméně mám podezření, že jsme se trošku vzdálili od tématu - tvrdil jsi, že dynamické jazyky mají flexibilitu, že můžeš z jedné funkce vracet false, None a nějaký jiný výsledek. Tak ti bylo ukázáno, že některé často používané statické jazyky (normálnější jako C++, méně obvyklé jako Haskell, Rust atd.) toto umí také v rámci součtových typů (variant atd.). Tudíž mi připadá, že výhoda flexibility u dynamického jazyku...vlastně není. Souhlasíš s tím? Pokud ne, mohl bys teda ukázat konkrétní kód v dynamickém jazyce týkající se tohoto problému, který není řešitelný v jazyce se statickými typy?

eee

Re:Problémy s JavaScript v praxi
« Odpověď #536 kdy: 10. 10. 2018, 16:38:33 »
A proto tady protestujeme proti té ne-flexibilitě statického jazyka: přes součtový typ naprosto bez problému uděláš chování, které bude ekvivalentní dynamickým jazykům. Kompiler přestane řvát na chyby typů (kromě počtu parametrů) - všechno bude jeden typ. Nic se nebude kontrolovat compile-time, všechno spadne runtime. Při běhu se budeš moct zeptat na tag ("typ") té hodnoty, kterou tvoje funkce dostane...

Obávám se, že jsi ještě pořád nepochopil pravou podstatu přívlastku dynamický. Zkus ve statickém jazyku za pomoci součtového typu a type inference implementovat tohle.

Kód: [Vybrat]
>>> data = 'A a=1 b=2 c=3'
>>> data = data.split(' ')
>>>
>>> cls = type(data[0], (), dict(s.split('=') for s in data[1:]))
>>> cls
<class '__main__.A'>
>>>
>>> obj = cls()
>>> obj
<__main__.A object at 0xb65c4e50>
>>> vars(obj)
{}
>>> obj.a
'1'

Tyhle legrácky ti ve statickém jazyku trochu zjednoduší život, ale dynamický jazyk tím ze statického neudělají a na jeho flexibilitu nedosáhnou. Práce s datovými typy v dynamickém jazyku je nový/vyšší level, které typovému/objektovému programování přidává nový rozměr.

eee

Re:Problémy s JavaScript v praxi
« Odpověď #537 kdy: 10. 10. 2018, 16:43:11 »
Implementace není podstatná, důležité je, jakou abstrakci ti to poskytuje na venek.
Souhlas. Sbstrakce, které poskytuje dynamický jazyk, jsou "zjištění tagu" (type, instanceof), volání funkcí (lze poslat jakoukoliv hodnotu dovnitř, můžeš dostat cokoliv ven). Což je identické ve statickém jazyku součtovému typu JSValue.

Sice souhlasíš, ale nechápeš, pleteš si abstrakci jazyka s jeho implementací. Vážně mezi tím nedovedeš rozlišit? To je prostě to omezené myšlení statických programátorů, kteří se na věc nedovedou podívat jiným pohledem, o kterém jsem psal. Nevím jak v tobě rozžehnout jiskru pochopení.

eee

Re:Problémy s JavaScript v praxi
« Odpověď #538 kdy: 10. 10. 2018, 16:53:23 »
Citace
Proto datové typy má i dynamický jazyk a neoznačují se tag, ale typ. V Pythonu máš datové typy a zjišťuješ je funkcí type(), nikoliv tag(), stejně tak to má Lua, obdobně v JS máš typeof nebo v php zase gettype() a tak dále. Snažit se to předefinovat je marná a hoavně hloupá snaha, která tě vede k nesmyslnému tvrzení, že číslo a string je v Pythonu ten samý datový typ.
Takže to není "tag", ale "typ", protože ta funkce se jmenuje "type" a ne "tag". A kdyby to autoři jazyka nazvali "tag", tak by to nebyl typ, ale tag....  eh... nedostává se mi slov...
Máš nějaký dar chápat věci obráceně, pozpátku a naruby. Ta kauzalita je přece opačná.  Jedná se o datové typy a proto autoři všech těch jazyků tyto introspektivní funkce nazývají type a ne tag :-).

eee

Re:Problémy s JavaScript v praxi
« Odpověď #539 kdy: 10. 10. 2018, 18:16:44 »
Citace
Máš omezené chápání datového typu jako formátu bytů v paměti, jako datový typ proměnné, tak jak s nimi zachází statické jazyky.
Ehm... tos ale před chvílí říkal ty...?
Citace: andy
Citace: eee
Datový typ není nic jiného, než definice/informace o těchto reálných datech v paměti, která specifikuje, jak s nimi zacházet.
Mám tendenci s tímhle nesouhlasit
???
Pochopil jsi mé vyjádření tak, že je to pouhý formát dat v paměti a nic víc? Pak jsi to pochopil špatně, je to informace, která specifikuje, jak s nimi zacházet a to ve smyslu co se s nimi dá a nedá dělat, jakých mohou nabývat hodnot, jejich interakce s ostatními typy, jak je lze konvertovat. Proto máš v pythonu třeba řadu datumových datových typů date, time, datetime, timedelta a podobně.

Zapomeň na datové typy jako na pouhou deklaraci uspořádání bajtů v paměti. To nikdy neplatilo ani pro C, viz jeho typedef.