Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - registrovany_ava

Stran: [1] 2 3 ... 8
1
Pro zajímavost, v Rustu se to dělá idiomaticky bez korutin i bez implementace vlastního iterátoru. Když už mám iterátor, a chci z něj jen vyfiltrovat některé položky, použiju prostě metodu filter, která vrací jiný iterátor. Ten má v sobě zabalený ten původní a predikát, při iteraci přeskakuje nevyhovující.

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=c93f0ee782a56a5e475f6e26c95229f3

fn filter_files(iter: impl Iterator<Item=String>) -> impl Iterator<Item=String> {
    iter.filter(|item| item.starts_with("Soubor"))
}

fn main() {
    let v = vec!["Soubor XXX".to_string(), "Adresar YYY".to_string()];
    for s in filter_files(v.into_iter()) {
        println!("{}", s)
    }
}


vypíše Soubor XXX.

Hej implementovať vlastný iterátor nemusíte, lebo ho už pred vami implemetovali programátri rustovského ekosystému. filter vracia špeciálny iterátor s názvom Filter ...

Jasně, vždyť přesně to můj příklad dělá :-) filter_files vrací Filter, akorát že ten Filter je tu maskovaný pod typem impl Iterator<Item=...>, abych se nemusel s tím typem vypisovat, a taky v budoucnu umožnil eventuelní změnu implementace bez narušení kompatibility typů funkce..

2
Pro zajímavost, v Rustu se to dělá idiomaticky bez korutin i bez implementace vlastního iterátoru. Když už mám iterátor, a chci z něj jen vyfiltrovat některé položky, použiju prostě metodu filter, která vrací jiný iterátor. Ten má v sobě zabalený ten původní a predikát, při iteraci přeskakuje nevyhovující.

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=c93f0ee782a56a5e475f6e26c95229f3

fn filter_files(iter: impl Iterator<Item=String>) -> impl Iterator<Item=String> {
    iter.filter(|item| item.starts_with("Soubor"))
}

fn main() {
    let v = vec!["Soubor XXX".to_string(), "Adresar YYY".to_string()];
    for s in filter_files(v.into_iter()) {
        println!("{}", s)
    }
}


vypíše Soubor XXX.

3
Vývoj / Re:BASH - echo "/!/"
« kdy: 02. 01. 2021, 11:43:42 »
Ok. A na čo to je dobre prakticky?

spustí ti to poslední příkaz z historie podle jeho začátku.
...

Doplňuji, že se často hodí vyhledávání v historii příkazů přes Ctrl-R.

4
Vývoj / Re:Trait a konstruktor
« kdy: 23. 12. 2020, 13:08:39 »
Dotty (Scala 3) podporuje parametrizované traity. (A také "intersection types", které mohou při práci s traity přijít vhod.)

Hmm, jaký pak zbývá rozdíl mezi trait a class kromě toho, že není možné dědit z více class najednou? Co by se stalo, kdyby se klíčové slovo class zrušilo a používaly se jen tyhle nové traity?

Nevím jak Dotty, ale základní rozdíl mezi dědičností a traity je v té dědičnosti. Když máš objekt O, do kterého přidáš trait T, tak ten objekt O není tím T. (Maximálně tak T obsahuje.) Zatímco když O dědí od předka P, tak O je P.

Jako asi pro tebe nic nového, ale tohle je prostě ten rozdíl 1. To je všechno.



1/ Tak maximálně ještě, že metody z traitu se obvykle nepřetěžují, že se s tím trochu jinak pracuje, a tak.

Mě to zajímá právě v Dotty, jestli tam mohou traity mít parametry při instanciaci, ptám se po rozdílu mezi trait a class, to byla tak poslední věc co class uměla a trait ne. Možná už to budou opravdu jen detaily - Java interop nebo tak, možná mi něco nedochází.

Ve Scale (i pre-Dotty) je totiž možné udělat tohle:

trait Foo {
    def hello(): Unit = {println("Hello, world")}
}

object Main {
    def useFoo(foo: Foo) {
        foo.hello()
    }

    def main(args: Array[String]) = {
        val foo = new Foo {};
        useFoo(foo)
    }
}

V tomhle kontextu mi přijde, že i tvé rozlišení v tom, že class znamená "být" a trait znamená "mít" se smývá, protože pokud něco jsem, tak to i mám, "mít" je silnější.

5
Vývoj / Re:Trait a konstruktor
« kdy: 22. 12. 2020, 09:53:45 »
Dotty (Scala 3) podporuje parametrizované traity. (A také "intersection types", které mohou při práci s traity přijít vhod.)

Hmm, jaký pak zbývá rozdíl mezi trait a class kromě toho, že není možné dědit z více class najednou? Co by se stalo, kdyby se klíčové slovo class zrušilo a používaly se jen tyhle nové traity?

6
Vývoj / Re:Trait a konstruktor
« kdy: 19. 12. 2020, 08:15:18 »
class C(val f: Integer) extends T {
  def printF(): Unit = {
    println(f)
  }
}
Tohle je docela hezký.

Jde nějak ještě když bych tomu chtěl přidat nějakou logiku? Tedy konstruktor přijme f, přepočítá ho, a teprve výsledek uloží do fieldu f?

Místo konstruktoru použiješ faktory metodu, typicky v associated objectu třídy.


trait T {
  def f: Integer
}

class C(val f: Integer) extends T {
  def printF(): Unit = {
    println(f)
  }
}

object C {
  def apply(s: String): C = {
    new C(s.toInt)
  }
}

object Main {
    def main(args: Array[String]): Unit = {
      C("11").printF()
    }
}

Ale taky mám radši composition over inheritance. Kdybych chtěl skládat tvůj UserAccount podle toho vzoru co ukazuješ, použil bych kompozici. I když by to ve Scale šlo poskládat z traitů s fieldy jak chceš, nelíbilo by se mi, že v definici UserAccount není jasně na jednom místě vidět, jaké fieldy nakonec v té třídě budou, člověk si musí projít všechny traity zvlášť, a přitom fieldy a jejich typy bývají pro porozumění kódu většinou to nejdůležitější.

7
Vývoj / Re:Trait a konstruktor
« kdy: 18. 12. 2020, 10:36:14 »
Jak psali přede mnou, Rustovské traity fieldy nemají, a nemám pocit, že by mi tam chyběly.

Scala je má, inicializují se přímo v definici traitu

trait T {
  val f: Integer = 1
}

class C extends T {
  def printF(): Unit = {
     println(f)
  }
}

Kdybych chtěl inicializaci odložit, tak z toho fieldu udělám abstraktní metodu, používá se to stejně jako field.

trait T {
  def f: Integer
}

class C(val f: Integer) extends T {
  def printF(): Unit = {
    println(f)
  }
}

8
/dev/null / Re:Aky kavovar pre dobru kavu?
« kdy: 10. 12. 2020, 08:38:20 »
No, nejsem na to expert, ale domácí presovače mi vždycky přišly jako pitomost. Smysl espressa je v tom udělat ho rychle (proto ten název), proto se stroje na výrobu espressa (mimochodem, ty co vidíš v kavárnách začínají někde na 200 000 Kč) tak rozšířily, můžeš zákazníkovi udělat dobrý kafe za 30 vteřin, s dvojpákou dvě najednou. Kdybych si chtěl udělat dobrý kafe doma, nebudu si pořizovat espressovač za desítky tisíc Kč, který stejně bude o řád horší než ten kavárenský, ale budu experimentovat s překapávanou kávou, džezvou, mokka kávou atp. Dají se z toho udělat stejně kvalitní a i zajímavější kávy než z presovače za řádově menší peníze, jen to prostě potrvá o minutu dýl (proto se to komerčně moc neuplatňuje), ale zas si s tím můžu hrát, a za ty ztracené minuty bych si na ten presovač stejně nevydělal.

Je to ovšem samozřejmě mimořádně subjektivní téma. I když jsem brigádně několik let dělal za barem a udělal tisíce káv, stejně radši piju čaj, a tein funguje stejně jako kofein :-)

9
Odkladiště / Re:Prodej Excel spreadsheetu
« kdy: 03. 12. 2020, 07:18:11 »
Tak ve statnim uz nikdo neumi ani v Excelu a tabulky si kupuji od part-time zamestnancu? Nepredpokladam, ze ta tabulka bude vyzadovat VBA backend, takze slecna mozna obarvi zahlavi a udela filtry. Nehlede na to, ze na evidenci uz by byla urcite vhodnejsi nejaka databaze.. Vam to nikomu neprijde divne? Rad bych se mylil, ale tudy se ztraci nase penize z dani  :)

Slečna narozdíl od tebe v tom výzkumáku pracuje, takže ví co a jak by tam bylo potřeba udělat. Ostatním děkujeme za příspěvky a rady.

10
Odkladiště / Prodej Excel spreadsheetu
« kdy: 02. 12. 2020, 14:41:30 »
Kamarádka se na mě obrátila s dotazem, obracím se na znalejší.

Pracuje na malý úvazek ve výzkumáku, kde nicméně příští rok nebude dost peněz na lidi, ale budou peníze na materiál (zní to bláznivě, ale není to k diskuzi). Napadlo ji, že by jako svůj přínos institutu, kde je docela platná a oblíbená, vytvořila spreadsheet, který by pomáhal s evidencí vzorků, a ten výzkumáku prodala za materiálové peníze, šéf by proti tomu asi nic neměl. Ráda by znala odpověď na dvě otázky, které možná zní naivně, ale zjistil jsem že na ně vlastně s jistotou nedovedu odpovědět.

1. Je možné prodávat .xls vyrobené v Excelu z Microsoft Office jen tak, samostatně, nejsou nějaké potíže např. s licencemi Office atp.?

2. Může to ona, nepodnikatel, obyčejná osoba, nějak výzkumáku prodat, nebo by si musela zařídit živnost, popř. to udělat přes prostředníka (což bych byl asi já, mám živnost na výrobu SW)? Jedná se o prodej v řádu nízkých desítek tisíc Kč.

11
Vývoj / Re:Rekurze v Javě (i jinde)
« kdy: 22. 11. 2020, 06:42:05 »
Scala to obchází pomocí tzv. trampolíny: https://free.cofree.io/2017/08/24/trampoline/

Trampolína není nic Scala-specifického, Scala žádnou automatickou trampolínozaci AFAIK nedělá, článek co odkazuješ vypráví o tom jak si rekurzivní funkci ztrampolínovat ručně. Tail rekurzivní funkce (tedy i tu co jsem uvedl já) Scala převádí sama na obyčejnou smyčku (jak je vidět i z bajtkódu co jsem postnul), obecné rekurzivní funkce se volají obyčejně přes zásobník.

No to je zajímavé, matně jsem si pamatoval, že to dělá automaticky (a netvrdil jsem, že to je specifické pro Scalu). Třeba tady píšou: However, to support TCO, Scala uses a well-known technique called a trampoline. Z čeho jsem tu informaci kdysi čerpal a jak to tam formulovali, už si nepamatuju.

Možná šlo fakt o tohle.

Jo, on ten článek asi myslí tu "podporu ve Scale" právě tak, že je ve standardní knihovně implementace trampolíny, která je m****a (nemusí se tu to slovo vyskytnout v každé druhé diskuzi :-), tudíž ji lze ve Scale narozdíl od většiny mainstreamových jazyků vyjádřit, a ještě má syntaktickou podporu pro snadné vytváření díky for comprehension.

12
Vývoj / Re:Rekurze v Javě (i jinde)
« kdy: 22. 11. 2020, 06:16:06 »
Scala to obchází pomocí tzv. trampolíny: https://free.cofree.io/2017/08/24/trampoline/

Trampolína není nic Scala-specifického, Scala žádnou automatickou trampolínozaci AFAIK nedělá, článek co odkazuješ vypráví o tom jak si rekurzivní funkci ztrampolínovat ručně. Tail rekurzivní funkce (tedy i tu co jsem uvedl já) Scala převádí sama na obyčejnou smyčku (jak je vidět i z bajtkódu co jsem postnul), obecné rekurzivní funkce se volají obyčejně přes zásobník.

No to je zajímavé, matně jsem si pamatoval, že to dělá automaticky (a netvrdil jsem, že to je specifické pro Scalu). Třeba tady píšou: However, to support TCO, Scala uses a well-known technique called a trampoline. Z čeho jsem tu informaci kdysi čerpal a jak to tam formulovali, už si nepamatuju.

Možná šlo fakt o tohle.

No úplně pro jistotu jsem to ještě zkusil, https://scalafiddle.io/sf/J2aN2OT/0:

def a(x: Int): Int = if (x == 0) {x} else {1 + a(x - 1)}
println("Finished")

a(100000)

přeteče (volání `a` není v tail pozici).

Tak možná se o tom ve Scale kdysi uvažovalo, nebo tam mají chybu, nevím. Každopádně díky za zajímavé odkazy. scala.util.control.TailCalls jsem ani neznal.

13
Vývoj / Re:Rekurze v Javě (i jinde)
« kdy: 21. 11. 2020, 18:53:38 »
Technická poznámka pro zajímavost: nepokračování bloku kódu může způsobit nejen výjimka, ale i nekonečná rekurze. Např. Scala má typ `Nothing`, který se typicky používá jako typ výsledku funkce, která nikdy neskončí.
Znamená to, že to Scala překládá do jiného bajtkódu, než je volání funkce? Tj. neukládá se volání na zásobník a může to být skutečná nekonečná rekurze?

Scala to obchází pomocí tzv. trampolíny: https://free.cofree.io/2017/08/24/trampoline/

Trampolína není nic Scala-specifického, Scala žádnou automatickou trampolínozaci AFAIK nedělá, článek co odkazuješ vypráví o tom jak si rekurzivní funkci ztrampolínovat ručně. Tail rekurzivní funkce (tedy i tu co jsem uvedl já) Scala převádí sama na obyčejnou smyčku (jak je vidět i z bajtkódu co jsem postnul), obecné rekurzivní funkce se volají obyčejně přes zásobník.

14
Vývoj / Re:Pár otázok na C++
« kdy: 21. 11. 2020, 08:25:18 »
Pokud chceš prostě spojit 100000 řetězců do jednoho, největší potíž při naivním přístupu  budou podle mě realokace, které se budou vyskytovat vždy když po nějakém počtu přidaných řetězců přeteče kapacita kontejneru, do kterého to sázíš (u std::string určitě, jak je interně implementovaný stringstream si nejsem jistý). Pokud ty spojované řetězce znáš předem, předalokuj si string s kapacitou takovou, aby se tam všechny vešly. Jestli je předem neznáš, zkus použít nějakou specializovanou strukturu jako je třeba rope.

A samozřejmě  benchmarkovat, benchmarkovat, benchmarkovat. S tím ti ale v C++ poradit nedovedu.

15
Vývoj / Re:Rekurze v Javě (i jinde)
« kdy: 20. 11. 2020, 18:36:53 »
Technická poznámka pro zajímavost: nepokračování bloku kódu může způsobit nejen výjimka, ale i nekonečná rekurze. Např. Scala má typ `Nothing`, který se typicky používá jako typ výsledku funkce, která nikdy neskončí.
Znamená to, že to Scala překládá do jiného bajtkódu, než je volání funkce? Tj. neukládá se volání na zásobník a může to být skutečná nekonečná rekurze?


Tak jsem z toho ten bajtkód dostal:

public scala.runtime.Nothing$ x();
  Code:
     0: goto          0

A CPU to žere, předtím jsem to nějak blbě pustil.

Stran: [1] 2 3 ... 8