Problémy s JavaScript v praxi

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Problémy s JavaScript v praxi
« Odpověď #540 kdy: 10. 10. 2018, 18:48:37 »
Zapomeň na datové typy jako na pouhou deklaraci uspořádání bajtů v paměti. To nikdy neplatilo ani pro C, viz jeho typedef.

@eee: problém programátorů od statických jazyků je, že uvažují o proměnných, zatímco dynamické jazyky jsou o hodnotách
@ostatní: statické jazyky nejsou o proměnných, ale o hodnotách
@eee: problém programátorů od statických jazyků je, že uvažují o typech jako o pouhém uspořádání bajtů v paměti.
@ostatní: typy ve statických jazycích nejsou o uspořádání bajtů v paměti
@eee: problém programátorů od statických jazyků je, že uvažují o proměnných, zatímco dynamické jazyky jsou o hodnotách
@ostatní: statické jazyky nejsou o proměnných, ale o hodnotách... aha!


BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Problémy s JavaScript v praxi
« Odpověď #541 kdy: 10. 10. 2018, 18:56:37 »
... číslo a string je v pythonu jiná hodnota toho samého součtového typu ...

Já si dovolím toho Pierce nečíst, a přesto bych měl otázku:

Mám typ: JSValue
Pak mám variantu typu JSString a JSNumber
A pak mám hodnotu typu "text", 43
Takže zápis v haskellu: JSString "text", JSNumber 43.

Nejsem si jist s tím názvoslovím, ale JSString není hodnota, ale konstruktor, ne?

Bacsa

Re:Problémy s JavaScript v praxi
« Odpověď #542 kdy: 10. 10. 2018, 19:36:16 »
... číslo a string je v pythonu jiná hodnota toho samého součtového typu ...

Já si dovolím toho Pierce nečíst, a přesto bych měl otázku:

Mám typ: JSValue
Pak mám variantu typu JSString a JSNumber
A pak mám hodnotu typu "text", 43
Takže zápis v haskellu: JSString "text", JSNumber 43.

Nejsem si jist s tím názvoslovím, ale JSString není hodnota, ale konstruktor, ne?
Jistě, konstruktor.

andy

Re:Problémy s JavaScript v praxi
« Odpověď #543 kdy: 11. 10. 2018, 12:21:10 »
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.
No... otázka, co s tím chceš dělat - tak nějak to zavání prasárnou... Nicméně v rámci toho, co jsem psal prostě vyrobíš nový JSObject a narveš tam ty hodnoty... něco jako:
Kód: [Vybrat]
f :: JSValue
newobject input =
  let (cls,data) = nejaky split/span input
       pairs = parse_pairs data
  in JSObject cls (fromList pairs) -- ten JSObject by asi mel byt trozku sirsi, neco jako Parent, __dict__ apod..
-- no a kdyz si zadefinujem nejake operatory (trosku kolize s haskellovymi, ale to se da skryt), tak pak klidne muze fungovat
main = do
  let obj = newobject "A a=1 b=2 c=3"
  print (obj.#a)
  print (typeOf obj)
atd...
What's the problem?

Citace
.. pleteš si abstrakci jazyka s jeho implementací. Vážně mezi tím nedovedeš rozlišit?
Když si udělám  modul "PyHaskell", která bude obsahovat typ JSValue, pár operátorů a funkcí, které pracují jenom s JSValue - tak výsledkem bude, že budu moct psát v podstatě totéž, jako píšeš v pythonu (haskell je "pure" a "immutable", takže v tom se to bude lišit, ale o tom se nabvíme). Bude to házet TypeError při běhu stejně jako python, budeš moct dělat "instanceOf" a "type" na JSValue stejně jako v pythonu. Budeš moct dereferencovat atributy velmi podobně jako v pythonu. Bude to všechno pracovat s jedním type JSValue.

Prostě importuju jednu knihovnu a budu z toho mít v podstatě python. Tak nevím, co je abstrakce a implementace - připadá mi, že jeden sumtype (JSValue) je abstrakce, která velmi přesně vystihuje to, o čem ty typy v pythonu jsou.

Citace
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 :-).
Jo, a autoři typovaných jazyků tomu říkají "tagged types" nebo "sum types". Tak mi zkus vysvětlit, jak se ten "tvůj typ" liší od "tagu". IMO je to úplně totéž...

Citace
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ě.
No, třeba jsem to pochopil, tak, že to je _mimo jiné_ formát v paměti. Když jsem psal, že "paměť je implementační detail", tak jsem to myslel docela dost vážně. Typ nemá s formátem dat v paměti nic společného.

eee

Re:Problémy s JavaScript v praxi
« Odpověď #544 kdy: 11. 10. 2018, 14:48:03 »
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.
No... otázka, co s tím chceš dělat - tak nějak to zavání prasárnou... Nicméně v rámci toho, co jsem psal prostě vyrobíš nový JSObject a narveš tam ty hodnoty... něco jako:
Kód: [Vybrat]
f :: JSValue
newobject input =
  let (cls,data) = nejaky split/span input
       pairs = parse_pairs data
  in JSObject cls (fromList pairs) -- ten JSObject by asi mel byt trozku sirsi, neco jako Parent, __dict__ apod..
-- no a kdyz si zadefinujem nejake operatory (trosku kolize s haskellovymi, ale to se da skryt), tak pak klidne muze fungovat
main = do
  let obj = newobject "A a=1 b=2 c=3"
  print (obj.#a)
  print (typeOf obj)
atd...
What's the problem?
Jasně, když to statický jazyk neumí, je to prasárna. :-)
Přoblém je, že a) jsi to neimplementoval, b) nepoužil jsi type inference a součtový typ, který dle tebe ze statických jazyků dělají stejně flexibilní a pohodlné jazyky jako jsou dynamické. Já ti jen ukazuji, že nikoliv. Jistě, nakonec můžeš nasimulovat celý interpret dynamického jazyka, ale nebude to pohodlné a nebude to mít smysl, když ten dynamický jazyk můžeš použít rovnou :-).


eee

Re:Problémy s JavaScript v praxi
« Odpověď #545 kdy: 11. 10. 2018, 14:57:17 »
Citace
.. pleteš si abstrakci jazyka s jeho implementací. Vážně mezi tím nedovedeš rozlišit?
Když si udělám  modul "PyHaskell", která bude obsahovat typ JSValue, pár operátorů a funkcí, které pracují jenom s JSValue - tak výsledkem bude, že budu moct psát v podstatě totéž, jako píšeš v pythonu (haskell je "pure" a "immutable", takže v tom se to bude lišit, ale o tom se nabvíme). Bude to házet TypeError při běhu stejně jako python, budeš moct dělat "instanceOf" a "type" na JSValue stejně jako v pythonu. Budeš moct dereferencovat atributy velmi podobně jako v pythonu. Bude to všechno pracovat s jedním type JSValue.

Prostě importuju jednu knihovnu a budu z toho mít v podstatě python. Tak nevím, co je abstrakce a implementace - připadá mi, že jeden sumtype (JSValue) je abstrakce, která velmi přesně vystihuje to, o čem ty typy v pythonu jsou.
Je tomarný, je to marný, je to marný :-). Nejsi schopen rozlišit mezi implementací a abstrakcí. To je hranice na který jsi zaseklý a nedovedeš ji překročit.

Ano, můžeš si ve svém statickém programu implementovat interpret dynamicho jazyka, ale pořád ti bude chybět jeho abstrakce, jeho jazyk. Takže to stále bude mít daleko k pohodlnosti a flexibilitě dynamického jazyka. Bude to stejně hloupé a nepohodlné, jako psát "python" program v C za pomoci jeho python api.

eee

Re:Problémy s JavaScript v praxi
« Odpověď #546 kdy: 11. 10. 2018, 15:01:23 »
Citace
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 :-).
Jo, a autoři typovaných jazyků tomu říkají "tagged types" nebo "sum types". Tak mi zkus vysvětlit, jak se ten "tvůj typ" liší od "tagu". IMO je to úplně totéž...
Takže typům říkají types, čemu na tom nerozumíš? To samé to není, ale protože rozdíl je ve vyšší abstrakci, je u tebe zbytečné na to poukazovat.

Pep

Re:Problémy s JavaScript v praxi
« Odpověď #547 kdy: 11. 10. 2018, 15:07:58 »
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'
Gratuluju k titulu prase roku. Dej to na hovnokód, tam ti to "ocení". A pak si přečti tu knihu, co ti byla doporučena, abys pochopil, že tento tvůj dementní příklad se ani v nejmenším netýká typů.

eee

Re:Problémy s JavaScript v praxi
« Odpověď #548 kdy: 11. 10. 2018, 15:24:36 »
Citace
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ě.
No, třeba jsem to pochopil, tak, že to je _mimo jiné_ formát v paměti. Když jsem psal, že "paměť je implementační detail", tak jsem to myslel docela dost vážně. Typ nemá s formátem dat v paměti nic společného.
Mimo jiné ovšem není jen a já se ti snažím vysvětlit, že datový typ není záležitost jen toho, jak je uložen v paměti nebo případně jak je staticky konstruován v interpretu. To není jeho podstatou.

eee

Re:Problémy s JavaScript v praxi
« Odpověď #549 kdy: 11. 10. 2018, 15:28:40 »
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'
Gratuluju k titulu prase roku. Dej to na hovnokód, tam ti to "ocení". A pak si přečti tu knihu, co ti byla doporučena, abys pochopil, že tento tvůj dementní příklad se ani v nejmenším netýká typů.
Můj příklad se bytostně týká typů, asi vůbec netušíš, co ta ukázka ukazuje.

Pep

Re:Problémy s JavaScript v praxi
« Odpověď #550 kdy: 11. 10. 2018, 15:44:08 »
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'
Gratuluju k titulu prase roku. Dej to na hovnokód, tam ti to "ocení". A pak si přečti tu knihu, co ti byla doporučena, abys pochopil, že tento tvůj dementní příklad se ani v nejmenším netýká typů.
Můj příklad se bytostně týká typů
A proč to jde udělat ve staticky typovaném jazyce úplně stejně (stejně pochybně)? Přiznej se, ty nemáš z informatiky ani Bc. Nestyď se ;)

andy

Re:Problémy s JavaScript v praxi
« Odpověď #551 kdy: 11. 10. 2018, 17:33:08 »
Jasně, když to statický jazyk neumí, je to prasárna. :-)
Ten kód výše ukazuje, že to umí...? A prasárna to je proto, že ze vstupu vyrábět napřímo třídu je koledování si minimálně o security problém. A ano, faktem je, že některé věci (deserializace) jinak v dynamicky typovaných jazycích rozumně dělat nejdou....ve statických samozřejmě ano.

Citace
Přoblém je, že a) jsi to neimplementoval,
Jak to "neimplementoval"? Tak je asi jasné, že implementace "přečti z hashmapy" (getattr, operátor "."), "vrať identifikátor 'typu'" (funkce type() - vrátí nějaký JSObject popisující parametr, případně odvozený od "parent class") a "isinstance" (proleze parenty, jestli se něco neshoduje) je docela triviální...teda aspoň pro mě je...

Citace
b) nepoužil jsi type inference a součtový typ, který dle tebe ze statických jazyků dělají stejně flexibilní a pohodlné jazyky jako jsou dynamické.
JSValue je součtový typ, v tom "let" je použita type inference. V tom kódu jsem omylem na začátku nechal "f :: JSValue" (mělo tam být jiné jméno funkce a typ), ale to se dá klidně smazat. V tom kódu nikde není jediná typová anotace, všechno je přes automatickou type inference..

Citace
Já ti jen ukazuji, že nikoliv. Jistě, nakonec můžeš nasimulovat celý interpret dynamického jazyka, ale nebude to pohodlné a nebude to mít smysl, když ten dynamický jazyk můžeš použít rovnou :-).
Až na to, že tohle _není_ interpret dynamického jazyka. Ten kód s těma "print" je normální haskellový kód, který přistuje k normálnímu haskellovému typu a volá úplně normální haskellové funkce. Akorát jsem ten typ JSValue zadefinoval jakou součtový typ, který je ekvivalentní tomu, jak to má zadefinované python.

Hanzelka ubil v Kostelci rusa. Akorát to nebyl Hanzelka, ale Zikmund, neubil ale upálil, ne v Kostelci ale v Kostnici, a ne rusa, ale Husa...

Mně na tom Kruger-Daningovu efektu nefascinuje ani tak to, že lidi, co o tématu neví nic, přeceňují svoje schopnosti. Spíš to, že lidi, kteří o tématu nic nevědí, nejsou své sebevědomí schopni korigovat ani když narazí, a jsou-li odkázáni na naprosto standardní oborovou literaturu, tak se do ní ani nepodívají, protože oni to přece ví nejlíp...

andy

Re:Problémy s JavaScript v praxi
« Odpověď #552 kdy: 11. 10. 2018, 17:35:46 »
... číslo a string je v pythonu jiná hodnota toho samého součtového typu ...

Já si dovolím toho Pierce nečíst, a přesto bych měl otázku:

Mám typ: JSValue
Pak mám variantu typu JSString a JSNumber
A pak mám hodnotu typu "text", 43
Takže zápis v haskellu: JSString "text", JSNumber 43.

Nejsem si jist s tím názvoslovím, ale JSString není hodnota, ale konstruktor, ne?
Ano, je to konstruktor. Myslel jsem to tak, že konkrétní číslo ("JSNumber 43") je hodnota daného typu.

eee

Re:Problémy s JavaScript v praxi
« Odpověď #553 kdy: 11. 10. 2018, 18:20:00 »
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'
Gratuluju k titulu prase roku. Dej to na hovnokód, tam ti to "ocení". A pak si přečti tu knihu, co ti byla doporučena, abys pochopil, že tento tvůj dementní příklad se ani v nejmenším netýká typů.
Můj příklad se bytostně týká typů
A proč to jde udělat ve staticky typovaném jazyce úplně stejně (stejně pochybně)? Přiznej se, ty nemáš z informatiky ani Bc. Nestyď se ;)
Tak to předveď :-).

eee

Re:Problémy s JavaScript v praxi
« Odpověď #554 kdy: 11. 10. 2018, 18:26:04 »
Jasně, když to statický jazyk neumí, je to prasárna. :-)
Ten kód výše ukazuje, že to umí...? A prasárna to je proto, že ze vstupu vyrábět napřímo třídu je koledování si minimálně o security problém. A ano, faktem je, že některé věci (deserializace) jinak v dynamicky typovaných jazycích rozumně dělat nejdou....ve statických samozřejmě ano.
V čem si tvůj kód mohu přeložit a vyzkoušet jeho funkčnost?

O security problém si koleduješ vždycky, když čteš data z venku. Je číst data z venku prasárna? Je snad json prasárna? :-)