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 ;)