abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×

včera 23:44 | IT novinky

Společnosti Dell a Canonical společně představily 5 nových počítačů Dell Precision s předinstalovaným Ubuntu. Jedná se o 4 notebooky a 1 all-in-one počítač. Cena počítačů s Ubuntu je o 100 dolarů nižší než jejich cena s Windows 10.

Ladislav Hagara | Komentářů: 6
včera 22:55 | Nová verze

Po pěti měsících vývoje od vydání verze 4.8 byla vydána nová verze 4.9 svobodného open source redakčního systému WordPress. Kódové označením Tipton bylo vybráno na počest amerického jazzového muzikanta a kapelníka Billyho Tiptona.

Ladislav Hagara | Komentářů: 0
včera 22:11 | Pozvánky

Spolek OpenAlt zve příznivce otevřených technologií a otevřeného přístupu na 146. brněnský sraz, který proběhne v pátek 17. listopadu od 18:00 hodin v restauraci Bogota na Nových Sadech.

Ladislav Hagara | Komentářů: 0
včera 21:55 | Nová verze

Dle plánu byla vydána nová verze 9.2.1 živé linuxové distribuce Slax. Novinkou je především přechod ze Slackware na Debian a z KDE na Fluxbox.

Ladislav Hagara | Komentářů: 2
15.11. 22:44 | Zajímavý projekt

Vítězným projektem letošního ročníku soutěže určené vývojářům open source hardwaru Hackaday Prize se stal podvodní kluzák (YouTube, Onshape). Cenu za nejlepší produkt získala braillská klávesnice pro chytré telefony Tipo (YouTube).

Ladislav Hagara | Komentářů: 0
15.11. 06:33 | Nová verze

Byla vydána verze 3.3 živé linuxové distribuce Tails (The Amnesic Incognito Live System), jež klade důraz na ochranu soukromí uživatelů a anonymitu. Přehled změn v příslušném seznamu. Řešena je také řada bezpečnostních problémů.

Ladislav Hagara | Komentářů: 3
15.11. 00:11 | Nová verze

Byla vydána beta verze Linux Mintu 18.3 s kódovým jménem Sylvia. Na blogu Linux Mintu jsou hned dvě oznámení. První o vydání Linux Mintu s prostředím MATE a druhé o vydání Linux Mintu s prostředím Cinnamon. Stejným způsobem jsou rozděleny také poznámky k vydání (MATE, Cinnamon) a přehled novinek s náhledy (MATE, Cinnamon). Linux Mint 18.3 bude podporován až do roku 2021.

Ladislav Hagara | Komentářů: 0
14.11. 21:44 | Nová verze

Byla vydána verze 5.2.0 svobodného integrovaného vývojového prostředí KDevelop. Přímo z menu KDevelopu lze nově analyzovat aplikace napsané v C/C++ pomocí nástroje Heaptrack. Vylepšena byla podpora programovacích jazyků C++, PHP a Python. Ke stažení a k vyzkoušení je binární balíček s KDevelopem 5.2.0 ve formátu AppImage.

Ladislav Hagara | Komentářů: 8
14.11. 17:33 | Nová verze

MojeFedora.cz informuje, že bylo oficiálně oznámeno vydání Fedory 27. Ve finální verzi vycházejí dvě edice: Workstation pro desktopové a Atomic pro cloudové nasazení. Fedora Server vzhledem k náročnosti přechodu na modularitu vychází pouze v betaverzi a finální verze je naplánována na leden. Vedle nich jsou k dispozici také alternativní desktopy v podobě KDE Plasma, Xfce a další a k tomu laby – upravené vydání Fedory například pro designery, robotiku, vědecké použití atd. Stahovat lze z Get Fedora.

Ladislav Hagara | Komentářů: 20
14.11. 17:22 | Pozvánky

Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt – tradičně první čtvrtek před třetím pátkem v měsíci: 16. listopadu od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).

xkucf03 | Komentářů: 0
Jak se vás potenciálně dotkne trend odstraňování analogového audio konektoru typu 3,5mm jack z „chytrých telefonů“?
 (9%)
 (1%)
 (1%)
 (1%)
 (73%)
 (14%)
Celkem 675 hlasů
 Komentářů: 36, poslední dnes 18:43
    Rozcestník

    Google Go v příkladech 2.

    16. 6. 2011 | Jan Mercl | Programování | 5230×

    V dříve publikovaných článcích na AbcLinuxu bylo zmiňováno, že Go je OOP jazyk, ale přitom nemá/nezná třídy a sémantika dědičnost je v něm atypická, řekněme přinejmenším z pohledu člověka zvyklého na např. C++ či třeba Javu. Tyto jazyky pro mnohé představují, vcelku oprávněně, něco jako současný standard z hlediska implementace OOP technik. Dnes se pokusíme některé obvyklé případy OOP, zhruba v duchu právě zmíněných jazyků, napsat v Go a to způsobem, který je v něm přirozený.

    Obsah

    Budeme se věnovat pouze tomu, jak se instance „tříd“ chovají (metody), nikoli tomu jak „vypadají“ (položky struktur). To druhé bylo již v minulosti probíráno a možná se podrobněji objeví jako některé z dalších témat. Poznamenejme, že v Go jsou navíc definice „rozložení“ obsahu typu a popis jeho chování, ortogonální koncepty – lze je studovat i navrhovat (téměř) nezávisle na sobě. Výhradu slovem „téměř“ ponechejme sémantice typu – často je prostě význam (pro programátora) oněch dvou tváří typu spolu provázán – i když o tom kompilátoru nic neříkáme. Příklady jsou, pro lepší přiblížení se stávajícím programátorům v jiných jazycích, „opřeny“ o strukturované typy, rád bych připomenul, že v Go lze metody definovat i pro další, např. číselné typy (pojmenované).

    V příkladech si prosím v řetězcových literálech místo \x25 představte znak procenta (%). Je to jen způsob jak obejít chybu 1770.

    Příklad 1: Abstraktní základní „třída“, virtuální metody

    link

    Budeme implementovat jednoduché OOP zadání: Chceme čistě abstraktní základní třídu a napsat její různé konkrétní implementace. Jak vidno, z pohledu (zjednodušené) OOP klasiky, všechny metody „třídy“ budou (muset být) virtuální.

    package main
    
    import (
        "fmt"
    )
    
    type Base interface {
        M()
    }
    
    type T struct {
        i int
    }
    
    func (t *T) M() {
        fmt.Printf("ř.16: \x25#v\n", t)
    }
    
    type U struct {
        s string
    }
    
    func (u *U) M() {
        fmt.Printf("ř.24: \x25#v\n", u)
    }
    
    func main() {
        var t, u Base = &T{42}, &U{"foo"}
        t.M()
        u.M()
    }
    

    Upravit/Spustit

    Výstup

    ř.16: &main.T{i:42}
    ř.24: &main.U{s:„foo“}

    Na ř.7 definujeme (veřejné – s velkým písmenem na začátku) rozhraní a na ř.8 deklarujeme jeho jedinou metodou M. Metody veřejného rozhraní, které má být možné implementovat i v jiných modulech, musí být také veřejné, opět tedy s velkým písmenem na začátku. Celá definice rozhraní Base je v tomto případě sémanticky shodná s definicí abstraktní třídy v jiném typickém OOP jazyku.

    Na ř.11 a 19 definujeme typy, které na ř.15 a 23 implementují všechny (jednu) metodu/y rozhraní Base. Díky tomu je zde sémantika shodná s „klasickým“ popisem tříd, která dědí z/jsou v typové hierarchii potomkem „třídy“ Base. Jen zde, v typickém Go OOP duchu, u typů implementujících rozhraní Base (čti např. „extends Base“), nemusíme tento fakt oznamovat. Kompilátor se pouze při typové kontrole na ř.28 ujistí, že typy T a U implementují Base a lze je tedy přiřadit do proměnných 't' a 'u'.

    Na ř.29 a 30 už jen zavoláme metodu M instancí 't' a 'u' a na výstupu programu si ověříme, že vše proběhne dle předpokladu.

    Rozhraní v Go mají klasickou OOP dědičnost (úplnou a vícenásobnou), viz též poslední část specifikace. Pokud je někdo zvyklý uvažovat v třídách/hierarchii tříd a potřebuje pouze virtuální metody (situace velmi blízká Javě), může je v Go nahradit pomocí rozhraní docela snadno a největší rozdíl je „záměna“ klíčových slov class vs interface, v sémantice je shoda podle mě úplná. Go programátor jen nebude vůbec mluvit o třídách, takže si s „klasickým“ OOP programátorem chvilku nebudou rozumět – i když oba vlastně budou v tomto případě dělat totéž.

    Příklad 2: DRY

    link

    Neboli „Don't repeat yourself“. Na ř.16 a 24 příkladu 1 děláme vlastně totéž. Jeden příkaz na aplikaci principu DRY asi nestačí, ale teď jde jen o schémata přístupu a řešení. Výpis (pomocný/ladící) instance, s rozlišením jak typu tak obsahu je často používaný pomocník. Nebyl by problém si napsat zcela ne-OOP funkci, která – díky Go reflection (Javaisté vědí, C++ RTTI by nám také ale v tomto případě také stačilo) – vypíše takové informace. Proč si ale zaplevelovat jmenný prostor, když to může být metoda, že? Čeho ale metoda? Rozhraní Base? Jistě by to tak být mohlo, ale to bychom si nic nového neukázali. Prostě by k metodě Base.M přibyla nějaká metoda Base.Show a tu bychom museli dvakrát implementovat pro typy T a U (a všechny další typy implementující Base). Napsat tohoto pomocníka jako statické metody T a U také moc nepomůže, opět bychom se dvakrát téměř opakovali. Nyní nastává vhodná příležitost pro Go styl dědičnosti. Řekněme, že pomocná metoda bude jen dočasná/ladící a neveřejná (to není podmínkou). Z pohledu „tříd“ T a U dědí z Base, z pohledu Go T a U implementuje Base a dědí z 'base' (zvolené jméno 'base' není ničím podstatné).

    package main
    
    import (
        "fmt"
        "path"
        "runtime"
    )
    
    type Base interface {
        M()
    }
    
    type base struct{}
    
    func (b base) show(me interface{}) {
        pc, file, line, ok := runtime.Caller(1)
        if !ok {
            panic(":-/")
        }
    
        fmt.Printf("\x25#x \x25s.\x25d: \x25#v\n", pc, path.Base(file), line, me)
    }
    
    type T struct {
        base
        i int
    }
    
    func (t *T) M() {
        t.show(t)
    }
    
    type U struct {
        base
        s string
    }
    
    func (u *U) M() {
        u.show(u)
    }
    
    func main() {
        var t, u Base = &T{i: 42}, &U{s: "foo"}
        t.M()
        u.M()
    }
    

    Upravit/Spustit

    Výstup:

    0x400deb prog.go.30: &main.T{base:main.base{}, i:42}
    0x400e3b prog.go.39: &main.U{base:main.base{}, s:„foo“}

    Na ř.13 definujeme typ 'base' a na ř.15 jeho metodu 'show'. Na ř.25 a 34 uvádíme 'base' jako položku struktur typu T a U. Pole bez jména, pouze s názvem typu je v Go struktuře (myšleno klíčové slovo struct) způsob, jak zdědit obsah takto děděného typu a současně i jeho metody. Alternativně by šlo totéž i s ukazatelem (viz diskuzi „“anonymous field“), ale to nyní pomineme. Oproti OOP klasice ale přijímač (obvykle prostě ukazatel) metody takového předka má typ pouze onoho předka, nikoli typu, který jej dědí. Proto na ř.30 a 39 metodě show předáváme i přijímač metody M.

    Příklad 3: Selektivní přístup

    link

    Další „standardní situací“ v OOP je případ, kdy dědíme téměř všechno od předchůdce až na jednu nebo jen několik málo metod. Ta/ty pak nějak modifikují chování zděděné/ých metod/y Zcela schematicky to v Go lze řešit takto:

    package main
    
    type base struct{}
    
    func (b *base) m1() {
        println("m1()")
    }
    
    func (b *base) m2() {
        println("m2()")
    }
    
    
    type successor struct {
        base
    }
    
    func (o *successor) m2() {
        println("taky m2(), ale jinak")
    }
    
    func main() {
        b, s := &base{}, &successor{}
        println("typ base")
        b.m1()
        b.m2()
        println("typ successor")
        s.m1()
        s.m2()
    }
    

    Spustit/Upravit

    typ base
    m1()
    m2()
    typ successor
    m1()
    taky m2(), ale jinak

    Na ř.3 definujeme základní typ/předchůdce 'base', na ř.5 a 9 jeho metody m1 a m2. Na ř.14 definujeme odvozený typ/následníka 'successor' a na ř.15 dědíme vše z předchůdce 'base'. Na ř.18 předefinováváme metodu m2, samozřejmě pouze pro typ 'successor'. Z výstupu programu vidno, že dle očekávání typ následníka podědil metodu m1, ale používá vlastní metodu m2. Mimochodem, pokud bychom v této 'overriden' metodě potřebovali volat metodu m2 předchůdce, (jako v Javě pomocí super), napsali bychom třeba před ř.19 „o.base.m2()“. Možná si to budete chtít vyzkoušet v Go playgroundu. U všech příkladů stačí klepnout na odkaz „Upravit/Spustit“.

    Na závěr

    link

    Dnešní díl byl určen hlavně programátorům, kteří jsou navyklí na implementaci OOP mechanismů ve stylu C++ a/nebo Javy. Go je OOP jazyk, ale právě jmenovaní mají často při prvním pohledu na Go pocit, že jsou ztraceni, protože v Go nenacházejí svoje oblíbené, protože skoro neustále používané, třídy a jejich dědičnost. Pokusili jsme se ukázat, že většinu dobrého, co lze v OOP najít, Go implementuje, jen tak trochu jinak. Jestli možná v něčem i snad o trochu lépe nechť posoudí laskavý čtenář sám.

    Laboratoře CZ.NIC

    O autorovi

    Jan Mercl, autor textu, pracuje v Laboratořích CZ.NIC jako programátor pro výzkum a vývoj.

           

    Hodnocení: 75 %

            špatnédobré        

    Nástroje: Tisk bez diskuse

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    16.6.2011 07:28 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Hm, tenhle přístup k polymorfizmu je zjevně odvozený z ady ;) Zajímalo by mě jestli můžu v Go odvodit nový typ např. z int? A jestli Go umí double dispatch?

    Jinak ty příklady nejsou moc výchovné protože ukazují dědění implementace, což je většinou nežádoucí.
    In Ada the typical infinite loop would normally be terminated by detonation.
    16.6.2011 09:28 mich | skóre: 16
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Typ z int odvodit lze (a pak k němu lze i přidávat metody). Go neumí přetížení funkcí.
    je to teď v módě, na žive o tom furt píšou
    16.6.2011 09:25 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Mně to z těch příkladů připadá spíš jako kompozice než jako dědičnost. Ale nečetl jsem specifikaci.
    Ještě na tom nejsem tak špatně, abych četl Viewegha.
    alblaho avatar 16.6.2011 12:06 alblaho | skóre: 17 | blog: alblog
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Na první pohled se mi to nějak přestává líbit. Mám pocit, že vazby jsou příliš volné a nedrží to po hromadě.

    Nějak jsem si oblíbil tu neskutečnou primitivnost Javy. Programování třeba v Pythonu je větší zábava, ale když má člověk udržovat kód, kde si původní autor hrál s metaprogramováním/dekorátory jiným způsobem, než je ten můj oblíbený, tak je to spíš detektivka.

    Zas ale pošilhávám po Scale... :-)
    16.6.2011 12:56 dopisovatel | blog: zpravicky
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Jedině Ruby
    16.6.2011 14:50 Ondřej Surý | skóre: 14
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    To je ten jazyk, který programátoři používají tak, že mění API v knihovnách i mezi minor releases a nepřipadá jim to divné? :)
    Nehledejte zlý úmysl tam, kde je dostatečným vysvětlením hloupost.
    16.6.2011 15:25 dopisovatel | blog: zpravicky
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Chceš snad tvrdit, že Ruby nemá výborný sraz příznivců v Brně?

    http://www.abclinuxu.cz/zpravicky/sraz-priznivcu-ruby-v-brne
    16.6.2011 21:34 Ondřej Surý | skóre: 14
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Chci tvrdit, že medvídek kaola jede na dovolenou k mývalovi. (Toto tvrzení je relevantní asi tak stejně to první k tomu Vašemu :).
    Nehledejte zlý úmysl tam, kde je dostatečným vysvětlením hloupost.
    16.6.2011 21:57 Ondřej Surý | skóre: 14
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Ale trochu na vážnou notu... přebral jsem balíkování rails pro Debian a z ruby-rchardet embedované v ruby-tmail embedované v ruby-actionpack mi fakt jde hlava kolem...
    Nehledejte zlý úmysl tam, kde je dostatečným vysvětlením hloupost.
    q66 avatar 16.6.2011 15:32 q66 | skóre: 32 | blog: Q's CZ devblog
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    článek hezký, ale Go se mi vůbec nelíbí..
    16.6.2011 19:47 dopisovatel | blog: zpravicky
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Moje řeč... Výborná věc je Ruby.
    alblaho avatar 16.6.2011 20:16 alblaho | skóre: 17 | blog: alblog
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Jenže Ruby je úplně jiný typ nástroje. Dynamické typování, interpretovaný kód... Go je statické a bude výkonově někde jinde, hlavně se snaží cílit na paralelní zpracování dat.

    Já mám Ruby rád, ale není to nástroj na všechno.
    Luboš Doležel (Doli) avatar 16.6.2011 22:09 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Ruby jsem hlavně strašně pomalé.
    16.6.2011 23:03 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Což pod komentářem Ruby je úplně jiný typ nástroje … Go je statické a bude výkonově někde jinde dává obrovský smysl.
    Ještě na tom nejsem tak špatně, abych četl Viewegha.
    Luboš Doležel (Doli) avatar 16.6.2011 23:07 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Ale ono je strašně pomalé na cokoliv. Nedovedu si představit, k čemu bych to kdy použil.
    17.6.2011 09:35 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Na normální skriptování je rychlé až až (u každého shellového skriptu, který má nad deset řádek, přemýšlím, že ho přepíšu do Ruby). A zdá se, že ta spousta webů v RoR taky nějak funguje, nebo ne? (Ha, už vidím argumentaci Twitterem! :-) )

    Mimochodem, mezi Ruby 1.8 a 1.9 je obrovský výkonnostní rozdíl.
    Ještě na tom nejsem tak špatně, abych četl Viewegha.
    17.6.2011 13:34 dopisovatel | blog: zpravicky
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    A taky právě v Ruby byla napsána některá skvělá vylepšení pro některé distribuce. Pokud existuje Ruby, může jít všechno ostatní do háje.
    Luboš Doležel (Doli) avatar 16.6.2011 23:12 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    (Uznávám, že jsem ten komentář nade mnou špatně přečetl)
    16.6.2011 22:42 x.
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Zlatej Python. Tam mrknu na kod a rychle vim, co dela, k cemu slouzi. I u toho C/C++ to clovek vetsinou odhali, ale Go?? Typicka ukazka jazyka, jak nema vypadat. To neni jazyk pro lidi, ale roboty. Nebo je to programatorem-autorem, protoze zvolil nevhodne priklady?
    17.6.2011 00:18 Sten
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Go používá hodně odlišný způsob myšlení. Taky se mi nelíbí, ale nezavrhoval bych jej, určitě si svoje příznivce najde (když to zvládlo Ruby :-D). Na druhou stranu to, co mi opravdu mezi jazyky chybí, je staticky typovaný jazyk (kvůli rychlosti běhu a compile-time kontrole chyb v práci s objekty) stylem podobný Pythonu (velmi jednoduchá syntaxe), ale schopnostmi blízký C++ (třeba generické programování — šablony, možnost low-level programování, logičtější přetěžování operátorů nebo vícenásobná dědičnost — Python nepotřebuje, když má duck-typing). Ano, vím, že existuje Boo, ale to je jenom pro .NET a navíc má hodně omezené schopnosti. Až budu mít čas, zkusím napsat nějaký překladač takového jazyka do C.
    alblaho avatar 17.6.2011 10:42 alblaho | skóre: 17 | blog: alblog
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Scala? Má dost z toho, co chceš, ale zase to asi není z nejjednodušších jazyků.
    17.6.2011 17:02 Sten
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Hmm, to vypadá hodně dobře
    ________________ avatar 18.6.2011 03:14 ________________ | skóre: 5 | blog: _
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Scala teda rozhodne neni minimalistický jazayk (oproti ostatným ML jazykom je najukecanejšia).
    alblaho avatar 18.6.2011 13:25 alblaho | skóre: 17 | blog: alblog
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Přijde mi, že jazyk se statickým typováním vždycky bude ukecaný. Protože programátor ty typy musí nějak specifikovat. Typová inference pomůže, ale až po té specifikaci. Naproti tomu v Pythonu, Ruby je vlastně jen jeden "typ" a běhová pravidla.
    ________________ avatar 19.6.2011 14:08 ________________ | skóre: 5 | blog: _
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    aj staticky typovaný jazyk môže byt úsporný pre porovnanie:

    statická scala:
    def add(a:Int, b:Int) = a + b

    dynamický python:
    def add(a, b): return a + b
    dynamický scheme:
    (define (add a b) (+ a b))
    statický F#:
    let add a b = a + b
    na scale mi vadí hlavne ten balast zbytočné zátvorky a aj zložené zátvorky označujúce začiatok a koniec bloku, ktoré len zneprehľadňujú kód, tektiež type inference v scale nefunguje najoptimálnejšie pretože u argumentov funkcií musím tak či tak zadávať názvy typov, pritom by si ich mohol prekladač automaticky odvodiť.
    ava avatar 19.6.2011 17:14 ava | skóre: 10
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Ty závorky mi ve scale přijdou docela užitečné, nechtěl bych místo
    (1 to 100).map{i => i * i}.filter{i => (i % 2) == 0} psát třeba
    (1 to 100)
      .map
        i => i * i
      .filter
        i => (i % 2) == 0
    
    nebo jak si to vlastně představuješ?

    U argumentů funkcí typy dovodit nejdou, protože při překladu dané funkce nevíš, ze kterých všech modulů bude zavolaná. Nebrání to ovšem dělat generické funkce
    scala> def joinStrings[T](x: T, y: T) = {x.toString + y.toString}
    joinStrings: [T](x: T, y: T)java.lang.String
    
    a tady už inference typů argumentů funguje, místo
    
    scala> joinStrings[Int](1, 2)
    
    klidně stačí napsat
    
    scala> joinStrings(1, 2)
    res0: java.lang.String = 12
    
    Jinak jo, staticky typovaný jazyk může působit úsporně :)
    Press any key to continue, or any other key to cancel
    19.6.2011 18:25 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Scala používá lokální typovou inferenci, proto je potřeba deklarovat typy argumentů. Osobně bych šel ještě dál a vynutil deklaraci i návratového typu, ale ten už Scala odvozuje. Jazyky, které používají plnohodnotnou typovou inferenci (Hindley-Milner a spol.) umí odvodit i typy argumentů.
    Ještě na tom nejsem tak špatně, abych četl Viewegha.
    ava avatar 19.6.2011 22:25 ava | skóre: 10
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Asi beru tento svůj příspěvek zpět, co se týče typových systémů, jsem začátečník a tady spíše matu než osvětluji. Jak píše ládíček, je možné provádět i inferenci typů argumentů (s tím, že co je vlastně "plnohodnotná" typová inference je podle mě subjektivní, dle wikipedie např. "As of 2008, GHC, a Haskell compiler, goes beyond HM, and now uses System F extended with non-syntactic type equality, for example." - ale to už bych slovíčkařil).

    Příklad s generickou funkcí joinStrings, který jsem uvedl, neukazuje na inferenci typů argumentů (lepší by bylo říci parametrů) podle těla funkce.

    Pokud jsem někomu zamotal hlavu, omlouvám se :)
    Press any key to continue, or any other key to cancel
    ________________ avatar 20.6.2011 22:49 ________________ | skóre: 5 | blog: _
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    >>Jak píše ládíček, je možné provádět i inferenci typů argumentů

    ja to aj v praxi používam takže viem že to funguje, aj v mojom predchádzajúcom poste bola ukážka:
    let add a b = a + b
    ak funkcii add priradím 2 parametre rovnakého typu tak si z nich prekladač automaticky odvodí typy argumentov...

    ak ale jednému argumentu priradím trebárs string a druhému trebárs integer tak prekladač vyhodí chybu. rovnako prekladač vyhodí chybu aj ked 2x zavolám funkciu v vždy s iným typom argumentov.
    alblaho avatar 19.6.2011 21:38 alblaho | skóre: 17 | blog: alblog
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    To jsem nemyslel. Jasně že Scala umí být úsporná, vždyť se tím chvástají. Ale stejně tam musí být kód, který ty typy specifikuje. Díky typové inferenci to sice nemusíš opisovat všude, ale někde tam ten kód je.
    20.6.2011 07:06 Ondra
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    jazyk se statickým typováním vždycky bude ukecaný
    rekl clovek, ktery v zivote neslysel o Haskellu...
    alblaho avatar 7.7.2011 08:34 alblaho | skóre: 17 | blog: alblog
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Náhodou, o Haskellu jsem přečetl celou knihu:-).

    Haskell i Scala mohou být velmi úsporné, protože ta syntaxe je mocná a navíc je tam typová inference.

    Ale zároveň to bude i "ukecané", protože nezanedbatelnou část programu bude tvořit specifikace typů. Srovnej třeba s Pythonem, kde je typ vlastně jen jeden ("slovník") a člověk to prostě jen používá.

    To je můj dojem z typického používání, i v tom Pythonu je možné mít "typové" vifikundace řešící třeba AOP, DbC atd.
    Bystroushaak avatar 17.6.2011 16:10 Bystroushaak | skóre: 32 | blog: Bystroushaakův blog | Praha
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    D, ale syntax je podobná C/Javě, z pythonu si to bere jen schopnosti.
    17.6.2011 16:51 Sten
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    D znám, ale mám k němu docela dost výhrad:
    • chybí alespoň virtuální vícenásobná dědičnost, docela běžně to používám u výjimek, hlavně u těch vyhazovaných mixiny: ENetworkFileRead (chyba sítě při čtení souboru) dědí z EFileRead (obsahuje např. URL souboru) i ENetwork (obsahuje např. IP adresu)
    • přetěžování operátorů má dost divnou syntaxi a nedovoluje použití ternární (SQL) aritmetriky, třeba a != b je automaticky !(a == b) a nelze to změnit (a přitom třeba i pro podporovaný double tohle u NaN neplatí)
    • chybí podpora pro dynamicky načítané knihovny (alespoň aby fungovalo RTTI, když už nefunguje garbage collector)
    • nepochopil jsem, jak jde udělat částečná inicializace šablon (jestli to jde; ve features je napsané, že to umí, v dokumentaci to ale vůbec není)
    • zápis šablon mi přišel poněkud zmatený, protože se velmi podobný zápis používá pro imperativní i generické programování (ale pro někoho to může být výhoda)
    18.6.2011 22:19 vladaf
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Vícenásobná dědičnost je právě vlastnost, které se v moderních jazycích snaží vyhýbat po otřesné zkušenosti z C++. Třeba autoři Fortranu 2003 to říkají zcela explicitně a u D to nejspíš nebude jiné, protože je to takové C++ done right.
    19.6.2011 08:13 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    protože je to takové C++ done right.

    To mi připomíná Linusovu hlášku o tom, že SVN je "CVS done right" ...
    In Ada the typical infinite loop would normally be terminated by detonation.
    q66 avatar 19.6.2011 10:23 q66 | skóre: 32 | blog: Q's CZ devblog
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    ale však ono je :) A D opravdu je "C++ done right"
    alblaho avatar 19.6.2011 13:52 alblaho | skóre: 17 | blog: alblog
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Btw, "CVS dnone right" není Linusova hláška, ale přímo moto Subversion. A je to dost přesné, SVN je oproti CVS poklad, ale v porovnání s Gitem neobstojí. Proto se tomu Linus posmíval.

    Vícenásobná dědičnost v C++ je fakt zlo :-).
    q66 avatar 19.6.2011 16:08 q66 | skóre: 32 | blog: Q's CZ devblog
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    jojo, Git je prostě nejlepší :-)
    19.6.2011 18:55 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Btw, "CVS dnone right" není Linusova hláška, ale přímo moto Subversion. A je to dost přesné, SVN je oproti CVS poklad, ale v porovnání s Gitem neobstojí. Proto se tomu Linus posmíval.
    "Posmíval" není asi to pravé. Ta citace zní: if you start with that kind of slogan, there's nowhere you can go. There is no way to do CVS right. Což je přesně jak já to vidím s C++, není jak ho "udělat dobře", špatné jsou už ty koncepty za tím. Nejlepší je se na to kompletně vykašlat a udělat to celé jinak, nejlépe přesně naopak. (Analogicky k Take CVS as an example of what not to do; if in doubt, make the exact opposite decision.)
    In Ada the typical infinite loop would normally be terminated by detonation.
    q66 avatar 19.6.2011 20:23 q66 | skóre: 32 | blog: Q's CZ devblog
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    No, zrovna to D je perfektní jazyk, koncepčně dost dobře vymyšlený, bere určitý koncepce z Javy, určitý z Cčka a C++ a přidává své vlastní a výsledek je dobrý; zato C++ je občas designovaný dost hrozně a jediný způsob, jakým ho využívám je "Cčko s objekty"
    20.6.2011 16:18 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    zrovna to D je perfektní jazyk
    Za prvé nic takového neexistuje - existují jen jazyky které jsou nepoužitelné, a méně nepoužitelné... a za druhé, který případ nastal z těchto dvou se uvidí až tak za 10 let, jak u Go, tak u D. (U C++ už se vidí :P )
    In Ada the typical infinite loop would normally be terminated by detonation.
    q66 avatar 20.6.2011 18:00 q66 | skóre: 32 | blog: Q's CZ devblog
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    pojmem "perfektní jazyk" myslím dobře navržený jazyk s dobrou použitelností
    19.6.2011 22:21 extremni lama | skóre: 14 | blog: e_lama
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Což je přesně jak já to vidím s C++, není jak ho "udělat dobře", špatné jsou už ty koncepty za tím.
    to ze necemu nerozumis neznamena ze je to spatne ;-)
    The enemy of my enemy is still my enemy.
    q66 avatar 19.6.2011 23:06 q66 | skóre: 32 | blog: Q's CZ devblog
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Ale ono to špatně je. :-)
    20.6.2011 07:30 extremni lama | skóre: 14 | blog: e_lama
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    nerad bych se opakoval :)
    The enemy of my enemy is still my enemy.
    q66 avatar 20.6.2011 13:58 q66 | skóre: 32 | blog: Q's CZ devblog
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    jojo, C++ fanboys to nikdy neuznají :-D
    20.6.2011 15:21 extremni lama | skóre: 14 | blog: e_lama
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    nene, ale C++ haters to nikdy neuznaji :-D
    The enemy of my enemy is still my enemy.
    q66 avatar 20.6.2011 15:48 q66 | skóre: 32 | blog: Q's CZ devblog
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    já nejsem hater, C++ používám :-D Jen nepoužívám stdlib, exceptions, multiple inheritance :-)
    20.6.2011 16:16 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    to ze necemu nerozumis neznamena ze je to spatne

    To samozřejmě ne, ale oba jevy najednou nastat můžou. A to je právě případ C++.
    In Ada the typical infinite loop would normally be terminated by detonation.
    19.6.2011 16:18 Sten
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Zajímavý, že třeba v té Scale vícenásobná dědičnost je a bez těch problémů (pomocí mixinů), co má C++. Takže D to má spíše stylem „nevíme, jak to rozumně udělat, tak to prohlásíme za vlastnost, která není potřeba/je špatná/se nedá implementovat/...“
    19.6.2011 16:33 Jablíčko
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Přijde mi, že asi hledáš právě Go :-) (až na ty generiky). Dokonce bych řekl, že Go duck-typing povyšuje na další úroveň (je to teda ještě pořád o trochu nižší level než mají některý funkcionální jazyky, viz například typový třídy v Haskellu).
    Freeman avatar 17.6.2011 08:38 Freeman | blog: freeemans
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Já se také přikláním k Pythonu, nicméně mě na Goo těší, že tam nejsou středníky a dolary :-)
    ________________ avatar 18.6.2011 03:21 ________________ | skóre: 5 | blog: _
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.

    mám jednu otázku na autora článku:

    panic("<img alt=":-(" class="emo" src="/images/smile/smutek.gif" />")

    ako prekladač jazyka zistí kde končí reťazec keď aj vo vnúti reťazca sa používa znak ukončenia reťazca bez escapovania?

    Luboš Doležel (Doli) avatar 18.6.2011 13:23 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
    Rozbalit Rozbalit vše Re: Google Go v příkladech 2.
    Dal jsem do kódu jiného smajlíka. Je zjevné, že engine Ábíčka nahrazuje sekvenci ":-(" obrázkem...

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.