Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Matador kdy 13. 08. 2018, 14:18:35

Název: Lexikální uzávěr typu třída v Javě
Přispěvatel: Matador kdy 13. 08. 2018, 14:18:35
Jde v Javě udělat uzávěr typu třída? Nedávno jsem na to narazil v Pythonu, tam to jde přímočaře, nejspíš kvůli dynamickému typování. Případně v jakých jazycích to jde nebo jaký je idiomatický způsob v Javě nebo C#? Lambda výrazy už jsou ve všech běžných jazycích (naštěstí), ale u tříd jsem na uzávěry kromě Pythonu nenarazil.
Název: Re:Lexikální uzávěr typu třída v Javě
Přispěvatel: Honza kdy 13. 08. 2018, 14:35:33
Obecně v Javě ne, ale pro každý případ (vstup/výstup) máš k dispozici interface.
Asi hledáš toto:
https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html
Název: Re:Lexikální uzávěr typu třída v Javě
Přispěvatel: andrej kdy 13. 08. 2018, 15:25:13
Počujte, Kefalín. A čo si vy predstavujete pod takým slovom 'Lexikální uzávěr'?
Název: Re:Lexikální uzávěr typu třída v Javě
Přispěvatel: Matador kdy 13. 08. 2018, 15:51:21
Citace od: andrej kdy 13. 08. 2018, 15:25:13
Počujte, Kefalín. A čo si vy predstavujete pod takým slovom 'Lexikální uzávěr'?
Ustálené termíny si snad umíš vygooglit, když je neznáš.
Název: Re:Lexikální uzávěr typu třída v Javě
Přispěvatel: pivni_milovnik kdy 13. 08. 2018, 17:14:46
Citace od: Matador kdy 13. 08. 2018, 15:51:21
Citace od: andrej kdy 13. 08. 2018, 15:25:13
Počujte, Kefalín. A čo si vy predstavujete pod takým slovom 'Lexikální uzávěr'?
Ustálené termíny si snad umíš vygooglit, když je neznáš.

Vite jak poznam lopatu? computer science terminy rikat v pocestéych spatne prelozenych frazich.
Název: Re:Lexikální uzávěr typu třída v Javě
Přispěvatel: Trader kdy 13. 08. 2018, 20:37:15
Citace od: Honza kdy 13. 08. 2018, 14:35:33
Obecně v Javě ne, ale pro každý případ (vstup/výstup) máš k dispozici interface.
Asi hledáš toto:
https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html
To s tím přece vůbec nesouvisí.
Ve Swiftu jde napsat toto:

func myFancyClass(x:Int) -> A.Type {
  class T : A {
    init() { print("outer scope: x=\(x)") }
  }
  return T
}
let X = myFancyClass(1)
let Y = myFancyClass(1)
let x = X()
let y = Y()
...

Nicméně ta syntax je hnus, lepší je staré dobré return class extends A { ... }
Název: Re:Lexikální uzávěr typu třída v Javě
Přispěvatel: Honza kdy 13. 08. 2018, 20:51:46
Citace od: Trader kdy 13. 08. 2018, 20:37:15
To s tím přece vůbec nesouvisí.
Ve Swiftu jde napsat toto:
Ano máš pravdu, se Swiftem to vůbec nesouvisí.
Název: Re:Lexikální uzávěr typu třída v Javě
Přispěvatel: Trader kdy 13. 08. 2018, 21:01:29
Citace od: Honza kdy 13. 08. 2018, 20:51:46
Citace od: Trader kdy 13. 08. 2018, 20:37:15
To s tím přece vůbec nesouvisí.
Ve Swiftu jde napsat toto:
Ano máš pravdu, se Swiftem to vůbec nesouvisí.
Souvisí, viz "Případně v jakých jazycích to jde". Ale tys tam plácnul blbost.
Název: Re:Lexikální uzávěr typu třída v Javě
Přispěvatel: mmm kdy 13. 08. 2018, 21:43:04
Citace od: Trader kdy 13. 08. 2018, 20:37:15
[/code]
Nicméně ta syntax je hnus, lepší je staré dobré return class extends A { ... }

javascript
Název: Re:Lexikální uzávěr typu třída v Javě
Přispěvatel: Honza kdy 13. 08. 2018, 21:58:53
Citace od: Trader kdy 13. 08. 2018, 21:01:29
Citace od: Honza kdy 13. 08. 2018, 20:51:46
Citace od: Trader kdy 13. 08. 2018, 20:37:15
To s tím přece vůbec nesouvisí.
Ve Swiftu jde napsat toto:
Ano máš pravdu, se Swiftem to vůbec nesouvisí.
Souvisí, viz "Případně v jakých jazycích to jde". Ale tys tam plácnul blbost.
Není to blbost, jak uděláš uzávěr v Javě, aby byl first-class? Tak, aby šel poslat jako parametr do nějaké další metody? Jakého typu bude, když zůstane inline? Abych ho použil se své metodě třeba dvakrát?
Název: Re:Lexikální uzávěr typu třída v Javě
Přispěvatel: Trader kdy 13. 08. 2018, 22:07:48
Citace od: Honza kdy 13. 08. 2018, 21:58:53
Citace od: Trader kdy 13. 08. 2018, 21:01:29
Citace od: Honza kdy 13. 08. 2018, 20:51:46
Citace od: Trader kdy 13. 08. 2018, 20:37:15
To s tím přece vůbec nesouvisí.
Ve Swiftu jde napsat toto:
Ano máš pravdu, se Swiftem to vůbec nesouvisí.
Souvisí, viz "Případně v jakých jazycích to jde". Ale tys tam plácnul blbost.
Není to blbost, jak uděláš uzávěr v Javě, aby byl first-class? Tak, aby šel poslat jako parametr do nějaké další metody? Jakého typu bude, když zůstane inline? Abych ho použil se své metodě třeba dvakrát?
Asi došlo k nedorozumění. Otázka se týká uzávěru třídy. Uzávěr nemá nic společného s funkcemi, jsou to dva naprosto ortogonální koncepty, uzávěr jen drží kontext (v tomto případě lexikální) pro nějaký jiný objekt. Pravda je, že pojem "uzávěr" (closure) se často používá jako synonymum pro lambda výraz, ale to je špatně, jak ostatně ukazuje i toto téma. V tom zmíněném Pythonu (nebo JS, tam to funguje úplně stejně) funkce může vrátit třídu (typ), která si drží kontext (typicky nějakou lokální proměnnou nebo parametr z vnějšího scopu). V Javě to téměř jistě nepůjde, ta nemá ani higher-kinded types, natož tohle. 
Název: Re:Lexikální uzávěr typu třída v Javě
Přispěvatel: Honza kdy 13. 08. 2018, 22:30:19
Citace od: Trader kdy 13. 08. 2018, 22:07:48
Asi došlo k nedorozumění. Otázka se týká uzávěru třídy. Uzávěr nemá nic společného s funkcemi, jsou to dva naprosto ortogonální koncepty, uzávěr jen drží kontext (v tomto případě lexikální) pro nějaký jiný objekt. Pravda je, že pojem "uzávěr" (closure) se často používá jako synonymum pro lambda výraz, ale to je špatně, jak ostatně ukazuje i toto téma. V tom zmíněném Pythonu (nebo JS, tam to funguje úplně stejně) funkce může vrátit třídu (typ), která si drží kontext (typicky nějakou lokální proměnnou nebo parametr z vnějšího scopu). V Javě to téměř jistě nepůjde, ta nemá ani higher-kinded types, natož tohle.
OK, to beru. Psal jsem, že v to Javě nepůjde.. Ale Function je tomu nejblíže, a Java stejně žádný jiný koncept k tomuto účelu nemá.
Název: Re:Lexikální uzávěr typu třída v Javě
Přispěvatel: Trader kdy 13. 08. 2018, 23:50:17
Citace od: Honza kdy 13. 08. 2018, 22:30:19
OK, to beru. Psal jsem, že v to Javě nepůjde.. Ale Function je tomu nejblíže, a Java stejně žádný jiný koncept k tomuto účelu nemá.
Jo, tím Function to jde možná částečně obejít, kdysi jsem tak něco řešil v Pythonu, než jsem zjistil, že to jde lépe. Mně osobně na tom zajímá, jak by se taková věc dala řešit při překladu (v Pythonu a JS to je vzhledem k dynamickému typování triviální). Ale to už je tak trochu vyšší dívčí...