"A je to porad bytecode, takze je to o dost pouzitelnejsi nez bastl zacinajici na R"Tak tady bych s výběrem slov byl opatrnější, a to nejen kvůli osobě autora. :-) To už bych rovnou mohl říct, že je mnohem lepší použít Common Lisp, protože "je to pořád poctivý nativní kód, takže je to o dost použitelnější, než bastl začínající na J." ;-) (A možná by to byla pravda, vzhledem k existenci léty prověřených objektových systémů, které s "dědičností a typy" umějí mnohem víc a přitom nejsou tak pomalé. :-) Tohle jen ukazuje, že suní Java je nejlepší implementace Javy, ale znásilňovat do ní jiné jazyky nemá až takový smysl.)
Ten Python a Ruby beriem (syntax inspirovana Perlom). Priklad v OCaml robi nie co ine; definuje nove premenne, ktore zakryju v danom rozsahu povodne a, b. Premenne (okrem ref) su v OCaml predsa konstantne.
Ok, vymena premennych nevysla. Co tak parsovanie URL argumentov do hash/map premennej?
$urlArgs = 'key1=value1&key2=value2'; %params = map { $$_[0] => $$_[1] } map { [ split /=/, $_ ] } split /\&/, $urlArgs;
Ako nieco podobne bude vyzerat v Python/Ruby?
V Perle mozem jednoducho doplnit tuto logiku to povodneho riesenia:
%params = map { +"\l$_->[0]" => "\l$$_[1]" } grep { $$_[0] =~ /^\p{IsUpper}/ && $$_[1] =~ /^\p{IsUpper}/ } map { [ split /=/, $_ ] } split '&', $urlArgs;
Vsimite si ako je ten kod linearizovany - ziadny vnoreny "for" a cely kod neprehladne uzaverety do volania dict(). Moje riesenie je uplne standardny Perl - vas Python kod by ste v normalnom projekte takto nezapisali pretoze ten vnoreny for je neprehladny.
Dajme si este jedno kolo - ake je hodnota parametra vo formate YYYY-MM-DD a rok je nizsi ako 2000, tak nech je zapisany ako rok 2000.
Pre referenciu predkladam riesenie v Perle:
#!/usr/bin/perl $urlArgs = '=Value1&Key2=Value2&Key3=1999-12-02'; %params = map { +"\l$$_[0]" => "\l$$_[1]" } map { $$_[1] =~ s/^(\d{4})/$1 < 2000 ? 2000 : $1/e; $_ } grep { $$_[0] =~ /^\p{IsUpper}/ && $$_[1] =~ /^(\p{IsUpper}|\d{4}(-\d\d){2}$)/ } map { [ split /=/, $_ ] } split '&', $urlArgs; print "$params{key3}\n";
Opat linearne pridanie zopar prikazov do existujuceho kodu. Standardny Perlovsky text-processing.
Tak skuste chciet aj osetrit nespravny vstup. Google na vas tiez nevyhodi vynimku ked zadate:
http://www.google.com/search?abc&&q=root.cz&abc=abc=abc
V Perle to bolo osetrene hned na prvy krat.
Pravda, nie je to celkom univerzalne ale zvysuje to citatelnost kodu dost zasadne v mnohych situaciach. type(var)
(obdoba ref(EXPR)
v Perle) je pekna vec ale tu ide o citalenost kodu a nie jeho debuggovanie.
Inak zvlastne, ze ked niekto kritizuje v Pythone vynutene odsadzovanie - tak argument je, ze to zvysuje citatelnost kodu a teda to nemoze byt ponechane na slobodnom uvazeni programatora. Ale ak niekto poukaze, ze jazyk nevynucuje lahke odlisenie zakladnych datovych typov, tak argument je, ze je na programatorovi aby uvazene nazval premenne :)
Moj zoznam vyhod:
Nevyhody:
Vsetky nevyhody su opravene v Perl6 - ale ked ten bude hotovy a pouzitelny, tak ja uz budem v dochodkovom veku ;)