Co si myslíte o OOP?

BoneFlute

  • *****
  • 1 685
    • Zobrazit profil
Re:Co si myslíte o OOP?
« Odpověď #1065 kdy: 19. 01. 2019, 18:45:46 »
Chlapi (a roby), mám zcela nový podnět do diskuse. Když odmyslím Lisp s jeho objektovou nadstavbou, existuje v (skutečném) OOP světě něco jako makra? Pokud ano, jak moc se používají a pokud ne, tak proč ne?

Asi bude (jak už to bejvá) problém s definicí, co jsou to makra.

Řekl bych, že tvému dotazu by mohlo nejvíce odpovídat některý z Aspect-Oriented frameworků pro Javu, které zasahují do výsledného bytecode.

Osobně se domnívám, že největší motivace jsou takové ty short-circuit operátory, nebo podobné serepetičky. Páč jinak mě nenapadá na co by nutně muselo být makro potřeba. Všechno se dá zapsat funkcí :-)


Kit

Re:Co si myslíte o OOP?
« Odpověď #1066 kdy: 19. 01. 2019, 18:58:27 »
Osobně se domnívám, že největší motivace jsou takové ty short-circuit operátory, nebo podobné serepetičky. Páč jinak mě nenapadá na co by nutně muselo být makro potřeba. Všechno se dá zapsat funkcí :-)

Všiml jsem si, že některé kompilátory privátní metody normálně expandují, jako by to bylo makro.

Kadet

Re:Co si myslíte o OOP?
« Odpověď #1067 kdy: 19. 01. 2019, 19:39:42 »
Makro je funkce mapujici na AST.
To je jenom jeden význam slova "makro". Makrům v C taky říkáme "makra" a s AST nepracují.
V C je makro preprocessoru mapovani z prvni textovy na druhou textovou reprezentaci. Kompiler pak prevede vysledek na ast a ten pak hodi do vyslednyho binarniho kodu.

Textova reprezentace (C plus preprocessor) -> Textova reprezentace (C) -> ast -> target

Jinymi slovy, nejaka funkce, ktera transformuje reprezentaci programu predtim nez se prevese na AST nebo na target. Zkratka nejaky predchroupani at uz jakyhokoliv typu.


quote author=Mirek Prýmek link=topic=20380.msg304529#msg304529 date=1547902897]
Cim bliz je reprezentace v textu podobna reprezentaci v ast, tim vypada makro citelneji.
To není nutně pravda. Např. v Elixiru je AST poměrně komplikované, ale moc to nevadí, protože napřímo s ním skoro nikdy nepracuješ. Používáš totiž quote (čili normální, bežný kód) a jenom tam občas třeba vpašuješ nějaký parametr nebo tak něco.
[/quote]

Elixir ma myslim prave jednoduchou a homoikonickou reprezentaci AST. Vsemozny konstrukce jako classy jsou implementovany prave pres manipulaci AST, pokud si vzpominam.

Pokud do quotace muzes vlozit parametr, pak se podle me jedna o tzv. quasiquotaci.

abcd - text
"abcd" - quotovany text, neboli string
f"abcd {n}" - quasiquotovany string, neboli string interpolation

Re:Co si myslíte o OOP?
« Odpověď #1068 kdy: 19. 01. 2019, 20:15:25 »
Jinymi slovy, nejaka funkce, ktera transformuje reprezentaci programu predtim nez se prevese na AST nebo na target. Zkratka nejaky predchroupani at uz jakyhokoliv typu.
No ono to právě není jedno, jakýho typu. Buď pracuju s textem, aniž bych znal jeho význam, nebo pracuju s AST. To je úplně něco jinýho a má to výrazně jiné možnosti.

Elixir ma myslim prave jednoduchou a homoikonickou reprezentaci AST.
No asi je to otázka, čemu chceš říkat "jednoduchá". Každopádně kdybys měl napsat AST tak, aby ti vygenerovalo nějaký kód, tak bys z toho moc nadšenej nebyl, je to trochu opruz. Jak jsem ale řekl, v drtivé většině případů to nepotřebuješ dělat.

Vsemozny konstrukce jako classy jsou implementovany prave pres manipulaci AST, pokud si vzpominam.
Elixir žádné classy nemá a makra se nepoužívají zas tak často (autor jazyka správně tvrdí, že zlaté pravidlo je "dokud to jde udělat funkcí, udělejte to funkcí"). Takže to si spíš asi s něčím pleteš.

Pokud do quotace muzes vlozit parametr, pak se podle me jedna o tzv. quasiquotaci.

abcd - text
"abcd" - quotovany text, neboli string
f"abcd {n}" - quasiquotovany string, neboli string interpolation
Tohle vůbec nechápu. S interpolací to, o čem jsem mluvil, nemá nic společnýho.

quote je taková trochu speciální funkce, která:
1. se spouští při překladu
2. vložíš do ní normální blok kódu a ona ti vrátí příslušný AST
3. tj. když do toho kódu vpašuješ parametr, quote ti ho vpašuje do toho AST, aniž bys AST musel "ručně" upravovat (provádět operace přímo nad daty AST)

Kód: [Vybrat]
$ iex
Erlang/OTP 21 [erts-10.0] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]

Interactive Elixir (1.6.6) - press Ctrl+C to exit (type h() ENTER for help)

iex(1)> quote do if f(1) do 1 else 2 end end
{:if, [context: Elixir, import: Kernel], [{:f, [], [1]}, [do: 1, else: 2]]}

iex(2)> f(1)
** (CompileError) iex:2: undefined function f/1

- na tomhle vidíš:

1. quote skutečně "cituje" svůj parametr (převádí ho na AST) - používám tam fci f/1, která není definovaná a ničemu to nevadí, protože se v tuhle chvíli nevolá

2. to elixirovské AST je fakt celkem komplikované (a tohle je ještě jednoduchý příklad, mohl bych ukázat složitější), není to jako v Lispu
« Poslední změna: 19. 01. 2019, 20:18:56 od Mirek Prýmek »

Re:Co si myslíte o OOP?
« Odpověď #1069 kdy: 19. 01. 2019, 20:47:15 »
Osobně se domnívám, že největší motivace jsou takové ty short-circuit operátory, nebo podobné serepetičky. Páč jinak mě nenapadá na co by nutně muselo být makro potřeba. Všechno se dá zapsat funkcí :-)
Občas se s tím dají udělat docela dobrý kravinky pro optimalizaci.

Např. kdysi (nevím jestli ještě dneska) byl v Elixiru nějakej modul pro zpracování unicode napsanej tak, že se online (fakt ve chvíli překladu std. knihovny) stáhla aktuální specifikace z nějakých stránek unicode.org nebo co - a přímo z té specifikace se makrem vygeneroval kód. Taková blbůstka :)


Inkvizitor

Re:Co si myslíte o OOP?
« Odpověď #1070 kdy: 20. 01. 2019, 09:09:24 »
No makro umožňuje psát věci jinak, řekl bych líp. Třeba v Rustu println! a spol., nic lepšího jsem zatím pro formátování řetězců neviděl. Ten formát napíšu hezky čitelně a úsporně, ale zároveň se mi zkontroluje při překladu, že tam mám parametrů přesný počet, že implementují potřebný trait atd. Jelikož pozdní vazba je tak super, šlo by v OOP minimálně počítat ty parametry, počet by měl sedět i přes existenci pozdní vazby.

Nahlédl jsem do manuálu Rustu a zjistil jsem, že zmíněný println! funguje stejně jako print v Pythonu. Ani PHP nezůstává nijak pozadu a také na to nepotřebuje makra. Něco mi snad uniklo?

Uniklo Ti to, co jsem psal. Když napíšu málo parametrů pro formát v Pythonu, v runtime mi to hodí výjimku. Překladač Rustu odmítne chybné parametry makra při překladu.

gll

  • ****
  • 429
    • Zobrazit profil
    • E-mail
Re:Co si myslíte o OOP?
« Odpověď #1071 kdy: 20. 01. 2019, 09:36:23 »
Uniklo Ti to, co jsem psal. Když napíšu málo parametrů pro formát v Pythonu, v runtime mi to hodí výjimku. Překladač Rustu odmítne chybné parametry makra při překladu.

parametry format může v pythonu kontrolovat linter

https://pypi.org/project/flake8-string-format/

Python 3.6, má format stringy,  kontrola názvů proměnných uvnitř format stringu funguje normálně.

gll

  • ****
  • 429
    • Zobrazit profil
    • E-mail
Re:Co si myslíte o OOP?
« Odpověď #1072 kdy: 20. 01. 2019, 09:51:08 »
V dynamických jazycích jako python a ruby nejsou makra moc potřeba.
V Ruby se makra (a DSLka) používají až tak extenzivně, že to dělá kód totálně nečitelný. Proto Ruby nemám rád - většina Ruby kódu, co jsem viděl, na mě působila jako že hlavní účel kódu je co největší onanie a ne srozumitelnost a čitelnost.

to nejsou makra. V Ruby jsou možná makra jen pomocí third party knihoven, ale nikdo je nepoužívá. Matsumoto se vyjádřil jasně, že makra v jazyku typu Ruby nejsou potřeba.

Kadet

Re:Co si myslíte o OOP?
« Odpověď #1073 kdy: 20. 01. 2019, 11:03:18 »
Jinymi slovy, nejaka funkce, ktera transformuje reprezentaci programu predtim nez se prevese na AST nebo na target. Zkratka nejaky predchroupani at uz jakyhokoliv typu.
No ono to právě není jedno, jakýho typu. Buď pracuju s textem, aniž bych znal jeho význam, nebo pracuju s AST. To je úplně něco jinýho a má to výrazně jiné možnosti.

Elixir ma myslim prave jednoduchou a homoikonickou reprezentaci AST.
No asi je to otázka, čemu chceš říkat "jednoduchá". Každopádně kdybys měl napsat AST tak, aby ti vygenerovalo nějaký kód, tak bys z toho moc nadšenej nebyl, je to trochu opruz. Jak jsem ale řekl, v drtivé většině případů to nepotřebuješ dělat.

Vsemozny konstrukce jako classy jsou implementovany prave pres manipulaci AST, pokud si vzpominam.
Elixir žádné classy nemá a makra se nepoužívají zas tak často (autor jazyka správně tvrdí, že zlaté pravidlo je "dokud to jde udělat funkcí, udělejte to funkcí"). Takže to si spíš asi s něčím pleteš.

Pokud do quotace muzes vlozit parametr, pak se podle me jedna o tzv. quasiquotaci.

abcd - text
"abcd" - quotovany text, neboli string
f"abcd {n}" - quasiquotovany string, neboli string interpolation
Tohle vůbec nechápu. S interpolací to, o čem jsem mluvil, nemá nic společnýho.

quote je taková trochu speciální funkce, která:
1. se spouští při překladu
2. vložíš do ní normální blok kódu a ona ti vrátí příslušný AST
3. tj. když do toho kódu vpašuješ parametr, quote ti ho vpašuje do toho AST, aniž bys AST musel "ručně" upravovat (provádět operace přímo nad daty AST)

Kód: [Vybrat]
$ iex
Erlang/OTP 21 [erts-10.0] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]

Interactive Elixir (1.6.6) - press Ctrl+C to exit (type h() ENTER for help)

iex(1)> quote do if f(1) do 1 else 2 end end
{:if, [context: Elixir, import: Kernel], [{:f, [], [1]}, [do: 1, else: 2]]}

iex(2)> f(1)
** (CompileError) iex:2: undefined function f/1

- na tomhle vidíš:

1. quote skutečně "cituje" svůj parametr (převádí ho na AST) - používám tam fci f/1, která není definovaná a ničemu to nevadí, protože se v tuhle chvíli nevolá

2. to elixirovské AST je fakt celkem komplikované (a tohle je ještě jednoduchý příklad, mohl bych ukázat složitější), není to jako v Lispu

V elixiru to jsou protocoly a jiny struktury, ne classy, ale nic to nemeni na to, ze jsou implementovany az v elixiru pomoci maker.

Pomoci quote a unquote delas v elixiru quasiquotaci. Klasicka quotace neni dostatecna. Priklad byl na quotaci stringu, kterou jsi nepochopil. V tomhle pripade nequotuju AST, ale pouze string. Doslova quotuju protoze pouzivam uvozovky.

Elixir AST je vlastne lisp, az na druhy parametr coz je nejaky context. Elixir je syntakticky cukr nad timhle jednoduchym AST.

https://hackernoon.com/understanding-elixir-macros-3464e141434c

BaldSlattery

Re:Co si myslíte o OOP?
« Odpověď #1074 kdy: 20. 01. 2019, 11:36:21 »
Jinymi slovy, nejaka funkce, ktera transformuje reprezentaci programu predtim nez se prevese na AST nebo na target. Zkratka nejaky predchroupani at uz jakyhokoliv typu.
No ono to právě není jedno, jakýho typu. Buď pracuju s textem, aniž bych znal jeho význam, nebo pracuju s AST. To je úplně něco jinýho a má to výrazně jiné možnosti.

Elixir ma myslim prave jednoduchou a homoikonickou reprezentaci AST.
No asi je to otázka, čemu chceš říkat "jednoduchá". Každopádně kdybys měl napsat AST tak, aby ti vygenerovalo nějaký kód, tak bys z toho moc nadšenej nebyl, je to trochu opruz. Jak jsem ale řekl, v drtivé většině případů to nepotřebuješ dělat.

Vsemozny konstrukce jako classy jsou implementovany prave pres manipulaci AST, pokud si vzpominam.
Elixir žádné classy nemá a makra se nepoužívají zas tak často (autor jazyka správně tvrdí, že zlaté pravidlo je "dokud to jde udělat funkcí, udělejte to funkcí"). Takže to si spíš asi s něčím pleteš.

Pokud do quotace muzes vlozit parametr, pak se podle me jedna o tzv. quasiquotaci.

abcd - text
"abcd" - quotovany text, neboli string
f"abcd {n}" - quasiquotovany string, neboli string interpolation
Tohle vůbec nechápu. S interpolací to, o čem jsem mluvil, nemá nic společnýho.

quote je taková trochu speciální funkce, která:
1. se spouští při překladu
2. vložíš do ní normální blok kódu a ona ti vrátí příslušný AST
3. tj. když do toho kódu vpašuješ parametr, quote ti ho vpašuje do toho AST, aniž bys AST musel "ručně" upravovat (provádět operace přímo nad daty AST)

Kód: [Vybrat]
$ iex
Erlang/OTP 21 [erts-10.0] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]

Interactive Elixir (1.6.6) - press Ctrl+C to exit (type h() ENTER for help)

iex(1)> quote do if f(1) do 1 else 2 end end
{:if, [context: Elixir, import: Kernel], [{:f, [], [1]}, [do: 1, else: 2]]}

iex(2)> f(1)
** (CompileError) iex:2: undefined function f/1

- na tomhle vidíš:

1. quote skutečně "cituje" svůj parametr (převádí ho na AST) - používám tam fci f/1, která není definovaná a ničemu to nevadí, protože se v tuhle chvíli nevolá

2. to elixirovské AST je fakt celkem komplikované (a tohle je ještě jednoduchý příklad, mohl bych ukázat složitější), není to jako v Lispu

V elixiru to jsou protocoly a jiny struktury, ne classy, ale nic to nemeni na to, ze jsou implementovany az v elixiru pomoci maker.

Pomoci quote a unquote delas v elixiru quasiquotaci. Klasicka quotace neni dostatecna. Priklad byl na quotaci stringu, kterou jsi nepochopil. V tomhle pripade nequotuju AST, ale pouze string. Doslova quotuju protoze pouzivam uvozovky.

Elixir AST je vlastne lisp, az na druhy parametr coz je nejaky context. Elixir je syntakticky cukr nad timhle jednoduchym AST.

https://hackernoon.com/understanding-elixir-macros-3464e141434c
Ty jseš dokonalý příklad Dunning-Krugera, jako vystřižený z jedné glosy o flatearthers “Retarded monkeys lecturing Nobel laureates”. No nic, každé fórum musí mít svého šaška, jde ti to lépe jež javamanovi ;)

gll

  • ****
  • 429
    • Zobrazit profil
    • E-mail
Re:Co si myslíte o OOP?
« Odpověď #1075 kdy: 20. 01. 2019, 11:38:12 »
Ty jseš dokonalý příklad Dunning-Krugera, jako vystřižený z jedné glosy o flatearthers “Retarded monkeys lecturing Nobel laureates”. No nic, každé fórum musí mít svého šaška, jde ti to lépe jež javamanovi ;)

v čem nemá pravdu?

BaldSlattery

Re:Co si myslíte o OOP?
« Odpověď #1076 kdy: 20. 01. 2019, 11:48:00 »
Ty jseš dokonalý příklad Dunning-Krugera, jako vystřižený z jedné glosy o flatearthers “Retarded monkeys lecturing Nobel laureates”. No nic, každé fórum musí mít svého šaška, jde ti to lépe jež javamanovi ;)
v čem nemá pravdu?
V těch kecech o logách, kontinuacích, ASTu...

Inkvizitor

Re:Co si myslíte o OOP?
« Odpověď #1077 kdy: 20. 01. 2019, 11:56:29 »
Uniklo Ti to, co jsem psal. Když napíšu málo parametrů pro formát v Pythonu, v runtime mi to hodí výjimku. Překladač Rustu odmítne chybné parametry makra při překladu.

parametry format může v pythonu kontrolovat linter

https://pypi.org/project/flake8-string-format/

Python 3.6, má format stringy,  kontrola názvů proměnných uvnitř format stringu funguje normálně.

Linter může kotrolovat jenom to, čemu rozumí. Makro si můžu napsat vlastní a mám to i s tou kontrolou, nejde jenom o standardní knihovnu.  Mimochodem právě na Pylintu je vidět, jak se vyplatí psát všechno "hloupě" jako ve statických jazycích, jinak přestane chápat, co se kam může posílat a kde se bere jaká hodnota a už nám s kontrolou nepomůže.

Kit

Re:Co si myslíte o OOP?
« Odpověď #1078 kdy: 20. 01. 2019, 12:12:34 »
No makro umožňuje psát věci jinak, řekl bych líp. Třeba v Rustu println! a spol., nic lepšího jsem zatím pro formátování řetězců neviděl. Ten formát napíšu hezky čitelně a úsporně, ale zároveň se mi zkontroluje při překladu, že tam mám parametrů přesný počet, že implementují potřebný trait atd. Jelikož pozdní vazba je tak super, šlo by v OOP minimálně počítat ty parametry, počet by měl sedět i přes existenci pozdní vazby.
Nahlédl jsem do manuálu Rustu a zjistil jsem, že zmíněný println! funguje stejně jako print v Pythonu. Ani PHP nezůstává nijak pozadu a také na to nepotřebuje makra. Něco mi snad uniklo?
Uniklo Ti to, co jsem psal. Když napíšu málo parametrů pro formát v Pythonu, v runtime mi to hodí výjimku. Překladač Rustu odmítne chybné parametry makra při překladu.

Však to v Pythonu odchytí testy, ne?

Re:Co si myslíte o OOP?
« Odpověď #1079 kdy: 20. 01. 2019, 12:27:34 »
to nejsou makra. V Ruby jsou možná makra jen pomocí third party knihoven, ale nikdo je nepoužívá. Matsumoto se vyjádřil jasně, že makra v jazyku typu Ruby nejsou potřeba.
Ok, je to možný, že to nejsou makra v tom smyslu, jak jsou implementovaný v Lispu nebo Elixiru. Ruby neznám tolik, abych to uměl pořádně posoudit. Každopádně se tomu makra říká [1] a používá se to k zavádění nové syntaxe, DSLek apod., což je typickej use case pro makra. A ten bordel, co tím Rubyisti vytvořili, je taky typickej pro nevhodný použití maker.

Pokud jsem se v tomhle nechal ošálit tím, že lidi používají zavádějící označení, a symptomatikou používání ne-maker v Ruby, tak se omlouvám a dík za korekci.

[1] https://pragmaticstudio.com/tutorials/ruby-macros