Portál AbcLinuxu, 1. května 2025 07:10

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Vložit další komentář
27.4.2016 20:58 kolcon | skóre: 15 | blog: kolcon
Rozbalit Rozbalit vše Re: Naučte mě Perl 6, IV. Pole
Odpovědět | Sbalit | Link | Blokovat | Admin
jak mam Perl rad, tak se mi P6 moc nelibi... tohle fakt nekomu prijde citelne?

sub rotate_sum ( @a, NaturalNumber $n ) { [Z+] ( [flat(0 xx $n, @a)], { .rotate } ... { .[0] != 0 } ); }
wamba avatar 27.4.2016 23:14 wamba | skóre: 38 | blog: wamba
Rozbalit Rozbalit vše Re: Naučte mě Perl 6, IV. Pole
Uvedu můj pohled proč je to nečitelné:
  • použil jsem hodně věcí typických pro Perl 6,
  • nenapsal jsem k tomu dokumentaci, ani příklady použití,
  • moje schopnost psát čitelný kód je omezena,
  • nebyla úplně moje priorita to napsat nejčitelněji jak to jde, a uznávám, že např. [flat(0 xx $n, @a)] by si asi zasloužilo rozepsat na více řádků (možná pomocí prepend).
Pokusím se vysvětlit, co to dělá.

Nejdříve na příkladu, při zadání 1 2 2 1 a 3
0 0 0 1 2 2 1
0 0 1 2 2 1 0
0 1 2 2 1 0 0
1 2 2 1 0 0 0
-----------------
1 3 5 6 5 3 1
vrátí 1 3 5 6 5 3 1.

Teď ke kódu:
  • [flat(0 xx $n, @a)] nultý prvek bude pole @a a před ním $n nul,
  • { .rotate } další prvek získáme tak, že předešlí prvek rotujeme,
  • { .[0] != 0 } získávej nové prvky (pole) dokud nebude na začátku nula,
  • [Z+] sečti pole po prvcích.
Z mého pohledu, toho dělá tento kód poměrně hodně. A po rozluštění toho nultého prvku se mi zdá i poměrně čitelný. A kdyby jsem tento podprogram napsal např. pomocí for, tak by to podle mě kód prodloužilo a čitelnost nezlepšilo. Doufám, že jsem tento kód alespoň částečně vysvětlil.
This would have been so hard to fix when you don't know that there is in fact an easy fix.
28.4.2016 19:17 kolcon | skóre: 15 | blog: kolcon
Rozbalit Rozbalit vše Re: Naučte mě Perl 6, IV. Pole
ok... chapu snahu o idiomaticky zapis, to je OK. Jen bych teda asi zmenil nazev zapisku na "co vsechno jde v P6". Protoze jestli si toto nekdo vygoogli jako tutorial pro P6, tak potes koste... (imho)
wamba avatar 28.4.2016 22:08 wamba | skóre: 38 | blog: wamba
Rozbalit Rozbalit vše Re: Naučte mě Perl 6, IV. Pole
Cílem blogu určitě není abych někoho učil Perl 6, první blog — Úvod odstavec Naučte mě Perl 6. Ten název měl evokovat, že bych se taky něco (nejen o Perlu 6) rád dozvěděl od čtenářů.

Co se týká operátoru ..., tak je to věc, na kterou je potřeba si zvyknout. Mně nečitelný nepřipadá. Já na něj nahlížím jako na jakýsi druh koncové rekurze, kde se zaznamenávají i mezivýsledky. Ale je pro mě snadnější a přirozenější myslet pomocí operátoru ..., než používat přímo podprogramy s koncovou rekurzí.
This would have been so hard to fix when you don't know that there is in fact an easy fix.
29.4.2016 13:28 kolcon | skóre: 15 | blog: kolcon
Rozbalit Rozbalit vše Re: Naučte mě Perl 6, IV. Pole
aha, ja teda nazev " Naučte mě Perl 6, dil XX" chapu tak, ze se tu naucim Perl, a ne tak, ze ty chces naucit Perl od ctenaru :)
wamba avatar 28.4.2016 00:12 wamba | skóre: 38 | blog: wamba
Rozbalit Rozbalit vše Re: Naučte mě Perl 6, IV. Pole
Mírně jsem opravil kód v rotate_sum. Snad je to teď čitelnější.
This would have been so hard to fix when you don't know that there is in fact an easy fix.
28.4.2016 01:32 lama
Rozbalit Rozbalit vše Re: Naučte mě Perl 6, IV. Pole
Odpovědět | Sbalit | Link | Blokovat | Admin
say 0, 1, * + * ...^ * > 1000
Takze jestli to spravne chapu:

Vyraz s hvezdickou vytvori lambda funkci. Takze treba * + * se prelozi na:
def f1(a, b): return a + b
Prvni hvezdicka je prvni parametr, druha druhy, ...

Druhy vyraz s hvezdickou je druha lambda funkce:
def f2(a): return a > 1000
Potom pri pouziti:
say 0, 1, f1 ...^ f2
runtime nejak dynamicky zjisti ze jsou tam funkce misto hodnot a zavola je k vygenerovani hodnot.

A jde nejak zapsat pomoci hvezdicek treba b - a ?
wamba avatar 28.4.2016 02:21 wamba | skóre: 38 | blog: wamba
Rozbalit Rozbalit vše Re: Naučte mě Perl 6, IV. Pole
Ano chápete to dobře. Co se týká hvězdičky tak první znamená první parametr a druhá druhý atd. Tak buď můžete použít místo whatever kódu blog { $^b - $^a } nebo v případě s infix operátor jako je - lze použít i hyper operátor R, který operátor obrací * R- *.
say ( 0, 1, {$^b - $^a} ...^ * ).[^10];
say ( 0, 1,    * R- *   ...^ * ).[^10];
This would have been so hard to fix when you don't know that there is in fact an easy fix.
29.4.2016 00:43 Yokotashi
Rozbalit Rozbalit vše Re: Naučte mě Perl 6, IV. Pole
Odpovědět | Sbalit | Link | Blokovat | Admin
Klingoni!
xsubway avatar 30.4.2016 08:43 xsubway | skóre: 13 | blog: litera_scripta_manet
Rozbalit Rozbalit vše Re: Naučte mě Perl 6, IV. Pole

Založit nové vláknoNahoru

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

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.