<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Jaros&#322;aw Zabie&#322;&#322;o - BLOG: Po wideokonferencji z Matzem</title>
    <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>moje notatki, linki, komentarze</description>
    <item>
      <title>Po wideokonferencji z Matzem</title>
      <description>&lt;p&gt;&lt;a href="http://blog.zabiello.com/articles/2008/02/15/wideokonferencja-z-matzem"&gt;Zapowiadana wcze&#347;niej&lt;/a&gt; wideokonferencja z tw&#243;rc&#261; j&#281;zyka Ruby, zosta&#322;a dobrze przygotowana przez Google. Obraz by&#322; wy&#347;wietlany na du&#380;ym ekranie, i co wa&#380;niejsze mo&#380;na by&#322;o zadawa&#263; pytania prelegentowi i uda&#322;o mi si&#281; nawet dwa zada&#263;. :)&lt;/p&gt;


	&lt;p&gt;Prawd&#281; m&#243;wi&#261;c oczekiwa&#322;em &#380;e Matz powie co&#347; nowego. Nic takiego nie by&#322;o. Mam wra&#380;enie &#380;e nawet slajdy jakie by&#322;y wy&#347;wietlane gdzie&#347; ju&#380; wcze&#347;niej widzia&#322;em. Moim zdaniem, Matz m&#243;wi tak s&#322;abo po angielsku, &#380;e powinien m&#243;wi&#263; w swoim j&#281;zyku, po japo&#324;sku, i korzysta&#263; z t&#322;umacza. Nie s&#261;dz&#281; &#380;e by&#322;oby wolniej, a nie trzeba by by&#322;o te&#380; powtarza&#263; po kilka razy tego samego pytania.&lt;/p&gt;


	&lt;p&gt;Zapyta&#322;em si&#281; go, czy istnieje jaka&#347; oficjalna specyfikacja j&#281;zyka Ruby (lub co&#347; podobnego do pythonowej publicznej &lt;a href="http://www.python.org/dev/peps/"&gt;listy proponowanych ulepsze&#324;&lt;/a&gt;). Brak jednego i drugiego powoduje, &#380;e jest pewne zamieszanie co do sk&#322;adni jaka ma wej&#347;&#263; do Rubiego 2.0. Tak naprawd&#281; to nikt nie wie w jakim kierunku ta sk&#322;adnia pod&#261;&#380;a. Np. nie wiadomo czy &lt;a href="http://www.rubyist.net/~matz/slides/rc2003/"&gt;wcze&#347;niej prezentowane przez Matza slajdy&lt;/a&gt; to tylko takie lu&#378;ne my&#347;li, czy te&#380; jakie&#347; powa&#380;ne propozycje. Nie wiadomo te&#380;&#160;czy cokolwiek z takich &amp;#8220;pomys&#322;&#243;w&amp;#8221; jest dyskutowane w jakim&#347; szerszym gronie poza w&#261;sk&#261; grup&#261; japo&#324;skich samuraj&#243;w (rozmawiaj&#261;cych oczywi&#347;cie tylko po japo&#324;sku).&lt;/p&gt;


	&lt;p&gt;Matz powiedzia&#322; &#380;e jaka&#347; specyfikacja j&#281;zyka jest tworzona przez grup&#281; tworz&#261;c&#261; projekt &lt;a href="http://rubini.us/"&gt;Rubiniusa&lt;/a&gt; i &#380;e jest z nimi w kontakcie. Widz&#281;, &#380;e Matz zaczyna si&#281; z kim&#347; liczy&#263;. To bardzo dobrze. Bo Ruby nie jest taki ca&#322;kiem m&#322;ody (jest w tym samym wieku co Java i tylko rok m&#322;odszy od Pythona) i ju&#380; dawno przesta&#322; by&#263; tylko prywatnym j&#281;zykiem Matza do zabawy.&lt;/p&gt;


	&lt;p&gt;Zapyta&#322;em si&#281; Matza te&#380; o kwesti&#281; sk&#322;adni tzw. &lt;em&gt;named parameters&lt;/em&gt; w Rubim. Czy ju&#380; jest jaka&#347; ustalona sk&#322;adnia i dlaczego po prostu nie skopiuje dobrego i przejrzystego rozwi&#261;zania jakie wyst&#281;puje od dawna w Pythonie? Dla tych co nie znaj&#261; Pythona, przypominam, &#380;e chodzi o wygodne wywo&#322;ywanie funkcji  z parametrami wyst&#281;puj&#261;cymi w dowolnej kolejno&#347;ci. Najlepiej zobaczy&#263; to na przyk&#322;adzie.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;a&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;b&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;C&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;d&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;D&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt;&lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;**&lt;/span&gt;&lt;span class="ident"&gt;kwargs&lt;/span&gt;&lt;span class="punct"&gt;):&lt;/span&gt;
  &lt;span class="ident"&gt;print&lt;/span&gt; &lt;span class="ident"&gt;a&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;b&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;d&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;kwargs&lt;/span&gt;
&lt;span class="ident"&gt;test&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;  &lt;span class="comment"&gt;# =&amp;gt; 1 2 C D () {}&lt;/span&gt;
&lt;span class="ident"&gt;test&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;d&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="number"&gt;3&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; 1 2 C 3 () {}&lt;/span&gt;
&lt;span class="ident"&gt;test&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;3&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;5&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;6&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;7&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; 1 2 3 4 (4, 5, 6, 7) {}&lt;/span&gt;
&lt;span class="ident"&gt;test&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;d&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;DE&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;foo&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;blah&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; 1 2 C DE () {'foo': 'blah'}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Parametry a i b s&#261; obligatoryjne, c i d posiadaj&#261; domy&#347;lne warto&#347;ci. &lt;code&gt;*args&lt;/code&gt; to lista dowolnych parametr&#243;w (mo&#380;na dzi&#281;ki temu wywo&#322;ywa&#263; funkcj&#281; z dowolnie wielk&#261; liczb&#261; parametr&#243;w). Za&#347; &lt;code&gt;**kwargs&lt;/code&gt; to s&#322;ownik pozwalaj&#261;cy na dodanie dowolnej ilo&#347;ci kolejnych &lt;em&gt;named parameters&lt;/em&gt;. W Pythonie jest to dosy&#263; czytelne i &#322;atwe do zrozumienia.&lt;/p&gt;


	&lt;p&gt;W Ruby sytuacja wygl&#261;da troch&#281; inaczej. Z jednej strony mamy du&#380;e ulepszenie w stos. do Pythona w postaci mo&#380;liwo&#347;ci wysy&#322;ania blok&#243;w kodu do metody. Z drugiej strony, nie mam w og&#243;le mo&#380;liwo&#347;ci wywo&#322;ania parametr&#243;w w dowolnej kolejno&#347;ci lub wywo&#322;ania tylko niekt&#243;rych z nich, reszt&#281; zostawiaj&#261;c warto&#347;ciom domy&#347;lnym.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;a&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;b&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;C&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;d&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;D&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt;&lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ident"&gt;block&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;print&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{a.inspect}&lt;/span&gt; &lt;span class="expr"&gt;#{b.inspect}&lt;/span&gt; &lt;span class="expr"&gt;#{c.inspect}&lt;/span&gt; &lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; 
  &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="comment"&gt;#{d.inspect} #{args.inspect} #{block.inspect}&amp;quot;&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;W Ruby nie ma jak wywo&#322;a&#263; &lt;code&gt;test(1,2,d=3)&lt;/code&gt;. Takie wygodne pomini&#281;cie na li&#347;cie parametru &lt;code&gt;c&lt;/code&gt; (bo ma domy&#347;ln&#261; warto&#347;&#263;) i tylko tych parametr&#243;w jakie nam pasuje mo&#380;liwe jest tylko w Pythonie. W Ruby aby zmieni&#263; parametr &lt;code&gt;d&lt;/code&gt; trzeba wywo&#322;a&#263; te&#380; parametr &lt;code&gt;c&lt;/code&gt;, czyli w tym wypadku &lt;code&gt;test(1,2,'C',3)&lt;/code&gt;. To jest bardzo niewygodne i powszechnie stosowanym trickiem na pomini&#281;cie tego ograniczenia jest przekazywanie hasza oraz opuszczanie klamer, kt&#243;re w Ruby s&#261; nieobowi&#261;zkowe. Zatem dla&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test2&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;opts&lt;/span&gt;&lt;span class="punct"&gt;={})&lt;/span&gt;
  &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{x.inspect}&lt;/span&gt; &lt;span class="expr"&gt;#{opts.inspect}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="ident"&gt;test2&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:d=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; 1 {:d=&amp;gt;4}&lt;/span&gt;
&lt;span class="ident"&gt;test2&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt;&lt;span class="symbol"&gt;:d=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:c=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;'&lt;/span&gt;&lt;span class="string"&gt;C&lt;/span&gt;&lt;span class="punct"&gt;'})&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; 1 {:d=&amp;gt;4, :c=&amp;gt;&amp;quot;C&amp;quot;}&lt;/span&gt;
&lt;span class="comment"&gt;# to samo bez nawias&#243;w i klamer:&lt;/span&gt;
&lt;span class="ident"&gt;test2&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:d=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:c=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;'&lt;/span&gt;&lt;span class="string"&gt;C&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; 1 {:d=&amp;gt;4, :c=&amp;gt;&amp;quot;C&amp;quot;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Pozornie uzyskuje si&#281; to samo. Faktycznie jest to tylko &amp;#8220;dirty hack&amp;#8221; i odpowiednik pythonowej konstrukcji&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test2&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;**&lt;/span&gt;&lt;span class="ident"&gt;opts&lt;/span&gt;&lt;span class="punct"&gt;):&lt;/span&gt;
    &lt;span class="ident"&gt;print&lt;/span&gt; &lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;opts&lt;/span&gt;
&lt;span class="ident"&gt;test2&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;d&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;C&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; 1 {'c': 'C', 'd': 4}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Po pierwsze, tym sposobem mo&#380;na do metody przekaza&#263; dowolny hasz. Nie ma kontroli na poziomie deklaracji metody, trzeba samemu j&#261; sobie dodatkowo zaimplementowa&#263;. Np. tak:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;params_check&lt;/span&gt;&lt;span class="punct"&gt;(*&lt;/span&gt;&lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;x&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;].&lt;/span&gt;&lt;span class="ident"&gt;keys&lt;/span&gt; &lt;span class="punct"&gt;-&lt;/span&gt; &lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;..-&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;
  &lt;span class="keyword"&gt;raise&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Forbiden params: &lt;span class="expr"&gt;#{forbiden.inspect}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="keyword"&gt;unless&lt;/span&gt; &lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;empty?&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;fun&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;opt&lt;/span&gt;&lt;span class="punct"&gt;={})&lt;/span&gt;
  &lt;span class="ident"&gt;params_check&lt;/span&gt; &lt;span class="ident"&gt;opt&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:c&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:d&lt;/span&gt;
  &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{x.inspect}&lt;/span&gt; &lt;span class="expr"&gt;#{opt.inspect}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="ident"&gt;fun&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:c=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;'&lt;/span&gt;&lt;span class="string"&gt;CE&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt; 
&lt;span class="comment"&gt;# =&amp;gt; 1 {:c=&amp;gt;&amp;quot;CE&amp;quot;}&lt;/span&gt;

&lt;span class="ident"&gt;fun&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:c=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;'&lt;/span&gt;&lt;span class="string"&gt;C&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="symbol"&gt;:d=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; 
&lt;span class="comment"&gt;# =&amp;gt; 1 {:d=&amp;gt;4, :c=&amp;gt;&amp;quot;C&amp;quot;}&lt;/span&gt;

&lt;span class="ident"&gt;fun&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:c=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;'&lt;/span&gt;&lt;span class="string"&gt;C&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="symbol"&gt;:d=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:foo&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;bar&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;hello&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;world&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
&lt;span class="comment"&gt;# =&amp;gt; RuntimeError: Forbiden params: [:foo, &amp;quot;hello&amp;quot;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Po drugie, w wypadku przekazywania dodatkowego hasza, pierwszy musi posiada&#263; klamry, bo inaczej nie ma mo&#380;liwo&#347;ci rozr&#243;&#380;nienia kt&#243;re dane maj&#261; wej&#347;&#263; do pierwszego, a kt&#243;re do drugiego hasza.&lt;/p&gt;


	&lt;p&gt;Ale wracaj&#261;c do tego co odpowiedzia&#322; Matz. Przyzna&#322; wprost, &#380;e te &lt;em&gt;named parameters&lt;/em&gt; jakie mia&#322;yby wej&#347;&#263; do Ruby 2.0 s&#261; tak naprawd&#281; zwyk&#322;ym&amp;#8230; haszem! (zobacz &lt;a href="http://www.rubyist.net/~matz/slides/rc2003/mgp00027.html"&gt;ten slajd&lt;/a&gt; z wcze&#347;niejszej prezentacji Matza)&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;fun&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;c&lt;/span&gt; &lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;C&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;d&lt;/span&gt; &lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="comment"&gt;# ...&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;co naprawd&#281; znaczy tyle co&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;fun&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt;&lt;span class="ident"&gt;c&lt;/span&gt; &lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;C&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;d&lt;/span&gt; &lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;})&lt;/span&gt;
  &lt;span class="comment"&gt;# ...&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Taka innowacja nie jest w zasadzie &#380;adn&#261; innowacj&#261;, ale sprowadza nas z powrotem do tego co &lt;strong&gt;ju&#380; jest&lt;/strong&gt;. Je&#347;li za&#347; jedyna zmiana jaka tu ma miejsce dotyczy tylko zast&#261;pienia znak&#243;w &lt;code&gt;=&amp;gt;&lt;/code&gt; jednym znakiem dwukropka (tak jak w Pythonie nawiasem m&#243;wi&#261;c) to albo ja tu czego&#347; nie rozumiem, albo to w og&#243;le jest bez sensu.&lt;/p&gt;</description>
      <pubDate>Thu, 21 Feb 2008 01:08:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:35e54175-dbd1-4a27-828a-cb9668b84c6a</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem</link>
      <category>ruby</category>
      <category>konferencja</category>
      <category>matz</category>
      <category>python</category>
    </item>
    <item>
      <title>"Po wideokonferencji z Matzem" by rsz</title>
      <description>&lt;p&gt;Ale&#380; oczywi&#347;cie &#380;e domkni&#281;cia s&#261; dost&#281;pne w Pythonie, chyba &#380;e m&#243;wicie o jakiej&#347; innej definicji domkni&#281;cia (polecam jak&#261;&#347; ksi&#261;&#380;k&#281; albo wyk&#322;ad z informatyki &amp;#8211; teoretycznej). I oczywi&#347;cie &#380;e w pythonie mo&#380;na w domkni&#281;ciu grzeba&#263; &amp;#8211; tyle &#380;e bardzo dooko&#322;a. Wg waszej linii ataku, nale&#380;a&#322;oby uzna&#263;, &#380;e r&#243;wnie&#380; np. Haskell nie ma domkni&#281;&#263;, a to ju&#380; by by&#322;o co najmniej niepowa&#380;ne.&lt;/p&gt;


	&lt;p&gt;Jak by nie by&#322;o, to zarzut &#380;e w pythonie nie mo&#380;na przes&#322;a&#263; bloku w przeciwie&#324;stwie do rubyego jest nieuzasadniony.&lt;/p&gt;


	&lt;p&gt;A mo&#380;e, rubinowe ch&#322;opaki, wyt&#322;umaczycie mi, co to jest dla Was blok i czym si&#281; r&#243;&#380;ni od funkcji anonimowej i od domkni&#281;cia bo mo&#380;e jest to poprostu r&#243;&#380;nica terminologiczna.&lt;/p&gt;</description>
      <pubDate>Thu, 28 Feb 2008 16:15:26 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:2b8e48b5-790a-4288-ac1d-ec62108c1c44</guid>
      <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem#comment-1450</link>
    </item>
    <item>
      <title>"Po wideokonferencji z Matzem" by Jiima</title>
      <description>&lt;p&gt;@lopex&lt;/p&gt;


	&lt;p&gt;Czy ja m&#243;wi&#281;, &#380;e co&#347; trzeba zlikwidowa&#263;? :). Nie nosz&#281; sweterk&#243;w w romby i nie mieszkam w Bia&#322;ymstoku. Po prostu nie p&#322;acz&#281; za brakiem domkni&#281;&#263; w Pythonie czy brakiem kontynuacji w JVM. Ka&#380;dy j&#281;zyk ma swoje zboczenia i trzeba do nich przywykn&#261;&#263;, jak si&#281; b&#281;dzie pr&#243;bowa&#322;o wsadzi&#263; wszystko do jednego j&#281;zyka to wyjdzie nam Visual Basic .NET&amp;#8230;&lt;/p&gt;</description>
      <pubDate>Thu, 28 Feb 2008 08:49:25 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:ab231e33-d627-47d3-8008-68420aa7f1d4</guid>
      <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem#comment-1449</link>
    </item>
    <item>
      <title>"Po wideokonferencji z Matzem" by lopex</title>
      <description>&lt;p&gt;Przecie&#380; nikt si&#281; tu nie piekli. Klasyczna r&#243;&#380;nica zda&#324; ;).&lt;/p&gt;


	&lt;p&gt;Wo&#322;ania wirtualne te&#380; mog&#261; nie&#378;le zagmatwa&#263;&amp;#8230; Powinny by&#263; zlikwidowane.&lt;/p&gt;


	&lt;p&gt;No tak, w pythonie te&#380; mo&#380;na przekazywa&#263; self&amp;#8217;a/this&amp;#8217;a jawnie: Klasa.metoda(Klasa()). Ale raczej nikt tego nie robi.&lt;/p&gt;


	&lt;p&gt;Oj, dlatego m&#243;wi si&#281; o wielu paradygmatach, nie trzeba t&#322;umaczy&#263; jednego w kontek&#347;cie drugiego.&lt;/p&gt;</description>
      <pubDate>Wed, 27 Feb 2008 18:51:24 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:5d179166-b09b-4d9b-86d4-39c39214ea6e</guid>
      <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem#comment-1448</link>
    </item>
    <item>
      <title>"Po wideokonferencji z Matzem" by Jiima</title>
      <description>&lt;p&gt;@lopex&lt;/p&gt;


	&lt;p&gt;Co kto lubi&amp;#8230; Ja te&#380; znam i nie mam ochoty si&#281; przepycha&#263;.&lt;/p&gt;


	&lt;p&gt;Jedna uwaga &amp;#8211; co do klas wewn&#281;trznych, nie tylko anonimowych w Javie, to wypaczasz to co powiedzia&#322;em. Klasa wewn&#281;trzna nie jest metod&#261;, tylko klas&#261;, kt&#243;ra mo&#380;e funkcjonowa&#263; niezale&#380;nie od obiektu z kt&#243;rego zosta&#322;a wzi&#281;ta i niezale&#380;nie od metody kt&#243;ra j&#261; utworzy&#322;a. St&#261;d jest pewn&#261; odmian&#261; domkni&#281;cia.&lt;/p&gt;


	&lt;p&gt;A co do zaciemniania &amp;#8211; problem wbrew pozorom dotyczy nie tylko pocz&#261;tkuj&#261;cych. Im czytelniejszy kod, tym lepiej, a closure potrafi to nie&#378;le zagmatwa&#263;. Nie m&#243;wi&#281;, &#380;e trzeba z nich zrezygnowa&#263;, a jedynie, &#380;e ich brak nie jest powodem do rozpaczy.&lt;/p&gt;


	&lt;p&gt;A co do programowania obiektowego, niejawny self / this te&#380; nie jest wsz&#281;dzie, skoro ju&#380; o tym m&#243;wimy.&lt;/p&gt;


	&lt;p&gt;Zamiast m&#243;wi&#263; &#380;e domkni&#281;cia s&#261; w Smalltalku czy innych j&#281;zykach, powiedz mi jak to umie&#347;ci&#263; w paradygmacie &amp;#8211; tzn. gdzie masz tu obiekt, sygna&#322; itp. To, &#380;e jaki&#347; j&#281;zyk programowania je posiada, nie oznacza &#380;e wsio OK. Nie ma &amp;#8220;czystych&amp;#8221; j&#281;zyk&#243;w, implementuj&#261;cych jeden paradygmat, no mo&#380;e poza niszowymi rozwi&#261;zaniami takimi jak Haskell.&lt;/p&gt;


	&lt;p&gt;I czego si&#281; denerwujesz, szkoda zdrowia :)&lt;/p&gt;</description>
      <pubDate>Wed, 27 Feb 2008 16:49:27 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:c26a8191-7b4e-4421-b99c-2df7d5c2346d</guid>
      <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem#comment-1446</link>
    </item>
    <item>
      <title>"Po wideokonferencji z Matzem" by lopex</title>
      <description>&lt;p&gt;@Jiima&lt;/p&gt;


	&lt;p&gt;&#8220;nie &#8211; do &#8211; ko&#324;ca&#8221; domkni&#281;ciem: mo&#380;e jednak rozwiniesz ? Dlaczego &#8220;the Ruby Way&#8221; ma by&#263; dla mnie autorytetem ? Znam dobrze bebechy MRI i jruby, chcesz mnie o&#347;wieci&#263; ?&lt;/p&gt;


	&lt;p&gt;&amp;#8220;poniewa&#380; s&#261; w stanie &#8220;domkn&#261;&#263;&#8221; stan obiektu z kt&#243;rego zosta&#322;y wzi&#281;te&amp;#8221; Haha!, jak to ka&#380;da metoda obiektu ;). Dlatego powtarzam: zagnie&#380;d&#380;one funkcje  pythonowe daj&#261; dok&#322;adnie to samo co klasy anonimowe w javie.&lt;/p&gt;


	&lt;p&gt;C# to zupe&#322;nie inna bajka pod wzgl&#281;dem domkni&#281;&#263;, bo s&#261;, p&#243;ki co&amp;#8230; (taki zreszt&#261; by&#322; kontekst postu). A kosmicznie inna bajka je&#347;li rozchodzi si&#281; o ca&#322;&#261; reszt&#281; (wliczaj&#261;c JIT/AOT a nawet semantyk&#281; bytecodu)&lt;/p&gt;


	&lt;p&gt;Faktycznie, dla pocz&#261;tkuj&#261;cych domkni&#281;cia mog&#261; by&#263; zaciemniaj&#261;ce, ale s&#261; zbyt mocnym narz&#281;dziem aby z nich rezygnowa&#263;. Obiekt&#243;wka te&#380; jest zaciemniaj&#261;ca bo jest niejawny self/this ?&lt;/p&gt;


	&lt;p&gt;Niezgodna z zasadami OOP ? A co ma piernik do wiatraka ? Jako&#347; w Smalltalku, Scali czy IO spisuj&#261; si&#281; wy&#347;mienicie, co to za herezje ?&lt;/p&gt;</description>
      <pubDate>Wed, 27 Feb 2008 14:40:12 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:da228656-200a-41b8-98dc-bed7047b8254</guid>
      <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem#comment-1445</link>
    </item>
    <item>
      <title>"Po wideokonferencji z Matzem" by Jiima</title>
      <description>&lt;p&gt;@lopex&lt;/p&gt;


	&lt;p&gt;Raczej jest &amp;#8220;nie &amp;#8211; do &amp;#8211; ko&#324;ca&amp;#8221; domkni&#281;ciem. R&#243;&#380;nice s&#261; subtelne ale istotne. Nie rozwodz&#261;c si&#281;, odsy&#322;am do &amp;#8220;the Ruby Way&amp;#8221;.&lt;/p&gt;


	&lt;p&gt;Anonimowe klasy nie daj&#261; do ko&#324;ca tego co funkcje zagnie&#380;d&#380;one, poniewa&#380; s&#261; w stanie &amp;#8220;domkn&#261;&#263;&amp;#8221; stan obiektu z kt&#243;rego zosta&#322;y wzi&#281;te, a tak&#380;e nawet stan wewn&#281;trzny funkcji, ale tylko w odniesieniu do zmiennych finalnych. Z tego co wiem, s&#261; prace nad tym by to zmieni&#263; i dostarczy&#263; Javie &amp;#8220;prawdziwych&amp;#8221; domkni&#281;&#263;.&lt;/p&gt;


	&lt;p&gt;C# to niezupe&#322;nie inna bajka. Poza du&#380;&#261; ilo&#347;ci&#261; przydatnych jak r&#243;wnie&#380; zupe&#322;nie nie trafionych cukierk&#243;w syntaktycznych jest to Java, z reszt&#261; j&#281;zyk powsta&#322; po to, by odebra&#263; developer&#243;w Javy Sunowi i sk&#322;oni&#263; ich do korzystania z narz&#281;dzi Microsoftu.&lt;/p&gt;


	&lt;p&gt;M&#243;wi&#261;c o problemach z domkni&#281;ciami, mia&#322;em na my&#347;li inne j&#281;zyki ni&#380; Ruby, takie w kt&#243;rych stosuje si&#281; je cz&#281;&#347;ciej, czasem zupe&#322;nie nie&#347;wiadomie. Takimi j&#281;zykami s&#261; Perl i ECMAScript, zw&#322;aszcza ten ostatni. Generalnie Closure zaciemnia sporo rzeczy, cho&#263; u&#322;atwia tworzenie j&#281;zyk&#243;w specyficznych dla domeny i niekt&#243;re inne sprawy, tak &#380;e nie wiem czy to taka super &amp;#8211; konstrukcja. Jest te&#380; w du&#380;ej mierze niezgodna z zasadami OOP (nic dziwnego, w sumie pochodzi z j&#281;zyk&#243;w funkcyjnych)&lt;/p&gt;</description>
      <pubDate>Wed, 27 Feb 2008 11:53:36 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:af285bd1-db17-4265-8650-29b11863e998</guid>
      <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem#comment-1444</link>
    </item>
    <item>
      <title>"Po wideokonferencji z Matzem" by lopex</title>
      <description>&lt;p&gt;@Jiima&lt;/p&gt;


	&lt;p&gt;&#8220;klasyczny&#8221; blok w Ruby nie jest r&#243;wnie&#380; domkni&#281;ciem ?&lt;/p&gt;


	&lt;p&gt;Anoniowe klasy w javie daj&#261; dok&#322;adnie to samo co zagnie&#380;d&#380;onej fukcje pythonowe. C# to jest ju&#380; inna bajka.&lt;/p&gt;


	&lt;p&gt;Domkni&#281;cia w rubym nie mog&#261; by&#263; optymalizowane bo blok mo&#380;na zawsze potraktowa&#263; jako Binding. Ale to jest problem Rubiego a nie samych domkni&#281;&#263;.&lt;/p&gt;</description>
      <pubDate>Tue, 26 Feb 2008 16:57:57 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:11860e29-f7a0-4091-ab2f-f7b04e699abc</guid>
      <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem#comment-1442</link>
    </item>
    <item>
      <title>"Po wideokonferencji z Matzem" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;@Jiima: nie mam nic do parametr&#243;w wymaganych. Czepiam si&#281; tylko tego, &#380;e Matz jedn&#261; protez&#281; proponuje zast&#261;pi&#263; drug&#261; protez&#261; (z hasza na hasz &amp;#8211; ale mi inowacja)&lt;/p&gt;</description>
      <pubDate>Tue, 26 Feb 2008 14:15:50 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:f0a087e1-2cfa-459e-89f5-3a8a5c9ff05c</guid>
      <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem#comment-1441</link>
    </item>
    <item>
      <title>"Po wideokonferencji z Matzem" by Jiima</title>
      <description>&lt;p&gt;@JZ&lt;br /&gt;
W&#322;a&#347;nie o te parametry wymagane mi chodzi&#322;o. Nie widz&#281; dlaczego mia&#322;yby by&#263; tak istotne, a zdaje si&#281; na to najbardziej narzeka&#322;e&#347;.
Rozwi&#261;zanie kt&#243;re aktualnie jest stosowane w Ruby nie przeszkadza mi specjalnie, jedyne w czym przeszkadza to tworzenie sensownej autokompletacji sk&#322;adni w IDE, dlatego nie rozumiem czemu mia&#322;oby by&#263; to takie z&#322;e jak m&#243;wisz.&lt;/p&gt;</description>
      <pubDate>Tue, 26 Feb 2008 13:49:47 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:9a638be5-d22f-4154-8457-e20c94c97899</guid>
      <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem#comment-1440</link>
    </item>
    <item>
      <title>"Po wideokonferencji z Matzem" by Jiima</title>
      <description>&lt;p&gt;@lopex&lt;br /&gt;&lt;/p&gt;


	&lt;p&gt;Zgadzam si&#281;, &#380;e lambda nie jest &#380;adnym rozwi&#261;zaniem, btw Guido podobno rozwa&#380;a&#322; jej wywalenie (wi&#281;c dziwi mnie &#380;e zosta&#322;a).
Blok to nie to samo co funkcja, przy czym &amp;#8220;klasyczny&amp;#8221; blok w Ruby nie jest r&#243;wnie&#380; domkni&#281;ciem. Z reszt&#261; to w sumie nie taki z&#322;y pomys&#322;, domkni&#281;cia potrafi&#261; wyczynia&#263; dziwne rzeczy z pami&#281;ci&#261;, wi&#281;c lepiej mie&#263; wyb&#243;r czy robimy domkni&#281;cie czy zwyk&#322;y blok.&lt;/p&gt;


	&lt;p&gt;Ale nie wiem, czemu brak domkni&#281;&#263; jest &amp;#8220;bol&#261;czk&#261;&amp;#8221;. Dla mnie w Rubym bol&#261;czk&#261; jest nieciekawa implementacja kontynuacji (p&#243;ki co), ale doskonale wiem, &#380;e sporo ludzi sobie bez nich radzi i nawet uwa&#380;a je za pomy&#322;k&#281;. To po prostu inny styl programowania. W Javie masz anonimowe funkcje wewn&#281;trzne, a w C# delegacje anonimowe i ca&#322;y ten bajzel dostarczany przez LINQ, wi&#281;c za domkni&#281;ciami bym tak bardzo nie p&#322;aka&#322;. Z drugiej strony w JS ka&#380;dy blok jest domkni&#281;ciem (podobnie jak w Perlu) i sporo z tego wynika cz&#281;sto k&#322;opot&#243;w&amp;#8230;&lt;/p&gt;


	&lt;p&gt;Jedynym &amp;#8220;b&#243;lem&amp;#8221; sk&#322;adni Pythona jest to, &#380;e nie daje si&#281; w nim tak &#322;adnie i czysto tworzy&#263; j&#281;zyk&#243;w specyficznych dla domeny, jak w Ruby czy Smalltalku. Ale czy naprawd&#281; jest to taka straszna wada?&lt;/p&gt;</description>
      <pubDate>Tue, 26 Feb 2008 13:46:40 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:45a9d9c7-d9e3-418d-967f-deadbd91dbbb</guid>
      <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem#comment-1439</link>
    </item>
    <item>
      <title>"Po wideokonferencji z Matzem" by lopex</title>
      <description>&lt;p&gt;Nie, python nie potrafi przes&#322;a&#263; nienazwanego bloku kodu (je&#347;li macie na my&#347;li lambd&#281; to nie roz&#347;mieszajcie mnie). Brak domkni&#281;&#263; w pythonie to jest jeszcze wi&#281;ksza bol&#261;czka, btw, ma&#322;o jest j&#281;zyk&#243;w kt&#243;re nie maj&#261; domkni&#281;&#263; (m.in. c/c++/java/python/pascal itp).&lt;/p&gt;</description>
      <pubDate>Tue, 26 Feb 2008 12:45:38 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:56c2700f-99b5-4152-97c2-6747fa767c57</guid>
      <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem#comment-1438</link>
    </item>
    <item>
      <title>"Po wideokonferencji z Matzem" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;rsz: Python potrafi przes&#322;a&#263; blok kodu, ale &lt;a href="http://mail.python.org/pipermail/python-list/2004-July/270951.html" rel="nofollow"&gt;nie potrafi&lt;/a&gt; nic w nim zmieni&#263;. St&#261;d np. nie jest mo&#380;liwe zaimplementowanie w Pythonie czego&#347; podobnego do railsowych szablon&#243;w RJS.&lt;/p&gt;


	&lt;p&gt;MacRayers: Pochwal&#281; si&#281; jak sko&#324;cz&#281;. Nie b&#281;dzie to jednak wcze&#347;niej ni&#380; za jakie&#347; 3 miesi&#261;ce.&lt;/p&gt;</description>
      <pubDate>Tue, 26 Feb 2008 11:42:48 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:28d3f6ba-9095-4bbf-ab93-e6779b39264a</guid>
      <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem#comment-1437</link>
    </item>
    <item>
      <title>"Po wideokonferencji z Matzem" by rsz</title>
      <description>&lt;p&gt;&amp;#8220;Z jednej strony mamy du&#380;e ulepszenie w stos. do Pythona w postaci mo&#380;liwo&#347;ci wysy&#322;ania blok&#243;w kodu do metody&amp;#8221;&lt;/p&gt;


	&lt;p&gt;- w jakim sensie w Pythonie nie mo&#380;na wysy&#322;a&#263; blok&#243;w? Mo&#380;esz zar&#243;wno funkcje nazwane, jak i anonimowe &amp;#8220;wysy&#322;a&#263;&amp;#8221;...&lt;/p&gt;</description>
      <pubDate>Tue, 26 Feb 2008 10:24:57 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:ec9c2725-a600-46af-8611-4c5cedde75c9</guid>
      <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem#comment-1436</link>
    </item>
    <item>
      <title>"Po wideokonferencji z Matzem" by MacRayers - YAR</title>
      <description>&lt;p&gt;Jarku, chwali&#322;e&#347; si&#281; ju&#380;, &#380;e w Helionie w zapowiedziach o ROR szykowana jest pozycja Twojego autorstwa ?&lt;/p&gt;


	&lt;p&gt;IMHO : bardzo dobry ruch. Kupi&#281; i oceni&#281;, mam nadziej&#281;, &#380;e si&#281;&#160;nie zawiod&#281;.&lt;/p&gt;</description>
      <pubDate>Tue, 26 Feb 2008 00:22:50 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:a96a82e7-6f46-4ffe-aa71-e7e12c683112</guid>
      <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem#comment-1435</link>
    </item>
    <item>
      <title>"Po wideokonferencji z Matzem" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;Wyksztusi&#322;e&#347; :) Nie wiem jakie znowu statyczne parametry? W Pythonie s&#261;&#160;(1) parametry wymagane, (1) z przypisan&#261; warto&#347;ci&#261; domy&#347;ln&#261;, (3) w dowolnej, nieokre&#347;linej ich liczbie i (4) w dowolne, nieokre&#347;lonej  liczbie jako named parameters. Jest to bardzo czytelne i &#322;atwe w u&#380;yciu. Nie wiem o co ci chodzi z tymi dynamicznymi parametrami, te w Pythonie (jak trzeba) te&#380; s&#261; dynamiczne, ale bez wariactwa. Poda&#322;by&#347; jaki&#347;&#160;przyk&#322;ad lepiej.&lt;/p&gt;</description>
      <pubDate>Mon, 25 Feb 2008 22:35:38 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:2cfbc799-3188-4858-9b68-de3c8f6b21b1</guid>
      <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem#comment-1432</link>
    </item>
    <item>
      <title>"Po wideokonferencji z Matzem" by Jiima</title>
      <description>&lt;p&gt;Przeciwnikiem statycznego typowania. Wiem, &#380;e czasem trudno mnie zrozumie&#263;, ostatnio zamiast krwi mam energy drinki (zamykamy projekt mocno po terminie), wi&#281;c sorry za niejasne zdania.&lt;/p&gt;


	&lt;p&gt;Wi&#281;c zbieraj&#261;c to do kupy, bo chyba si&#281; w og&#243;le nie rozumiemy, chodzi mi o to, &#380;e IMAO w&#322;a&#347;nie te nazwane parametry nie s&#261; do niczego potrzebne, generalnie idealnym rozwi&#261;zaniem by&#322;oby kompletnie dynamiczne rozpatrywanie listy argument&#243;w, tak jak w ECMAScripcie. Skoro chcemy dynamizmu i wolno&#347;ci, to czemu potrzebne s&#261; takie rozwi&#261;zania jak statyczne named parameters?
Czy teraz wyksztusi&#322;em z siebie sk&#322;adne zdanie :P?&lt;/p&gt;</description>
      <pubDate>Mon, 25 Feb 2008 17:42:49 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:547dada0-bfe0-48b6-ad62-e3d27c7dcd91</guid>
      <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem#comment-1429</link>
    </item>
    <item>
      <title>"Po wideokonferencji z Matzem" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;Przeciwnikiem czego? Z tymi haszami to jest nawet nie podobnie, to jest identycznie i dlatego to jest bez sensu nazywa&#263; to &lt;em&gt;named parameters&lt;/em&gt; o kt&#243;rych potrzebie dodania tr&#261;bi&#322;o si&#281; ju&#380; od dawna. Jestem przeciwko stosowaniu hasza jako protezy &lt;em&gt;named parameters&lt;/em&gt; je&#347;li by&#322;aby mo&#380;liwo&#347;&#263; mie&#263; je z prawdziwego zdarzenia, tak jak np. w Pythonie. A z braku laku, mniej tam perlowy dwuznak nie przeszkadza.&lt;/p&gt;</description>
      <pubDate>Mon, 25 Feb 2008 13:43:51 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:5e6da695-69a9-4a09-9377-3271ea50b6d0</guid>
      <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem#comment-1427</link>
    </item>
    <item>
      <title>"Po wideokonferencji z Matzem" by Jiima</title>
      <description>&lt;p&gt;@JZ&lt;br /&gt;
No w&#322;a&#347;nie o to chodzi, &#380;e zawsze by&#322;e&#347; jego przeciwnikiem, tymczasem zarzucasz rozwi&#261;zaniu haszowemu, &#380;e nie wymusza dyscypliny podawania wymaganych parametr&#243;w :) Tymczasem s&#261; to do&#347;&#263; podobne zagadnienia.&lt;/p&gt;


	&lt;p&gt;Ja tam jestem raczej za tym, &#380;eby sk&#322;adnia s&#322;ownik&#243;w wykorzystywa&#322;a : zamiast tej debilnej perlowej strza&#322;ki =&amp;gt;. Mniej pisania i te&#380; wszystko si&#281; zunifikuje :).&lt;/p&gt;</description>
      <pubDate>Mon, 25 Feb 2008 13:34:48 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:ecd4bea2-63a7-42fb-9265-60de80b3dfad</guid>
      <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem#comment-1425</link>
    </item>
    <item>
      <title>"Po wideokonferencji z Matzem" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;@Jiima: Je&#347;li to hasz to nic to nie zmienia. U&#380;ywanie hasza w Ruby do symulacji named parameters ju&#380; jest od dawna. Nie pami&#281;tam abym broni&#322;&#160;samych unit test&#243;w, chodzi&#322;o mi &lt;a href="http://blog.zabiello.com/articles/2007/10/28/shoulda-rspec" rel="nofollow"&gt;Shoulda&lt;/a&gt; kt&#243;ry dostarcza BDD na bazie unit test&#243;w. G&#322;&#243;wnym problemem z RSpec by&#322;a magia sk&#322;adni. Jednak ksi&#261;&#380;ka &amp;#8220;The Rails Way&amp;#8221; mi to troch&#281; wyklarowa&#322;a. Ju&#380; to nie jest problemem, a RSpec zaczyna stawa&#263; si&#281;&#160;wiod&#261;c&#261; bibliotek&#261; Rubiego do BDD. Jest bardziej zaawansowany ni&#380; Shoulda czy test/specs. Widzia&#322;e&#347; RSpec Stories?&lt;/p&gt;


	&lt;p&gt;Statycznego sprawdzania typ&#243;w nigdy nie broni&#322;em, zawsze by&#322;em jego przeciwnikiem, wi&#281;c tu ci si&#281; co&#347; pomyli&#322;o.&lt;/p&gt;</description>
      <pubDate>Mon, 25 Feb 2008 13:01:06 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:c4cb43b1-9cf6-4696-8f00-cfac5b268f57</guid>
      <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem#comment-1422</link>
    </item>
    <item>
      <title>"Po wideokonferencji z Matzem" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;Pomijaj&#261;c to, &#380;e nie podoba mi si&#281; sk&#322;adnia dwukropka, mo&#380;e to i by&#322;oby jakie&#347; rozwi&#261;zanie ale pod warunkiem, &#380;e to ta sk&#322;adnia nie by&#322;aby alternatywn&#261; sk&#322;adni&#261; hasza (w tak to funkcjonuje teraz w Ruby 1.9). Jak sobie wyobra&#380;asz wywo&#322;anie funkcji z named parameters oraz dodatkowym haszem? B&#281;d&#261; wtedy same dwukropki czy jedno i drugie?&lt;/p&gt;


	&lt;p&gt;Ja bym tam g&#322;osowa&#322; aby nie mo&#380;na by&#322;o przypisywa&#263; zmiennych w parametrach formalnych (tak jak w Pythonie). Ust&#281;pstwo niewielkie a korzy&#347;ci spore.&lt;/p&gt;</description>
      <pubDate>Mon, 25 Feb 2008 10:59:10 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:25c335f7-e902-494e-ac44-5a94ab7a3ab7</guid>
      <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem#comment-1421</link>
    </item>
    <item>
      <title>"Po wideokonferencji z Matzem" by Jiima</title>
      <description>&lt;p&gt;Hej.
Nie odnosicie wra&#380;enia, &#380;e dyskutujecie nad wy&#380;szo&#347;ci&#261; Bo&#380;ego Narodzenia nad Wielkanoc&#261;? Nie chc&#281; marudzi&#263;, ale tak naprawd&#281; nie ma to wi&#281;kszego znaczenia czy jest to hash czy nie.
W Perlu wszystkie argumenty s&#261; przekazywane jako lista (dla puryst&#243;w perlowych &amp;#8211; tablica). W Javascript tak naprawd&#281; te&#380;, a konkretne zmienne parametr&#243;w to jedynie cukierek syntaktyczny.
@JZ
Troch&#281; nie rozumiem twojej niekonsekwencji. Wcze&#347;niej dyskutowa&#322;e&#347; ze mn&#261; nad tym, jakie  jest statyczne sprawdzanie typ&#243;w i &#380;e dobre unit testy s&#261; du&#380;o lepsze (ostatnio powoli zaczynam si&#281; z tob&#261; zgadza&#263;, ale to chyba Squeak rzuca mi si&#281; na m&#243;zg :P) . A tutaj narzekasz &#380;e w Ruby nie ma statycznego sprawdzania istnienia b&#261;d&#378; nie argument&#243;w nazwanych (moim zdaniem jeszcze lepiej by by&#322;o, gdyby te pozycyjne te&#380; by&#322;y opcjonalne).
Poza tym por&#243;wnywanie Ruby i Pythona jest troch&#281; bez sensu &amp;#8211; ka&#380;dy z tych j&#281;zyk&#243;w ma swoje mocne i s&#322;abe strony i co gorsza, jedynym sposobem na ich pogodzenie jest&amp;#8230; stworzenie nowego j&#281;zyka. Tylko jak cudowny by on nie by&#322;, raczej si&#281; nie przyjmie, przynajmniej dop&#243;ki Microsoft albo Sun nie uznaj&#261; &#380;e da si&#281; na nim zarobi&#263;&amp;#8230;&lt;/p&gt;</description>
      <pubDate>Mon, 25 Feb 2008 10:11:27 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:9b31fecf-f7ca-484c-8c5a-5a9004c93f93</guid>
      <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem#comment-1419</link>
    </item>
    <item>
      <title>"Po wideokonferencji z Matzem" by lopex</title>
      <description>&lt;p&gt;Dwukropki w&#322;a&#347;nie wnosz&#261; bardzo du&#380;o, a to dlatego &#380;e mog&#322;byby nie tworzy&#263; hasha.&lt;/p&gt;</description>
      <pubDate>Mon, 25 Feb 2008 01:05:59 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:05f0bab4-8c20-4cdd-82aa-06c9c8a2fc49</guid>
      <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem#comment-1418</link>
    </item>
    <item>
      <title>"Po wideokonferencji z Matzem" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;@lopex: co&#347; za co&#347;. S&#261;dz&#281;, &#380;e warto mie&#263; lepsze, przejrzyste &lt;em&gt;named parameters&lt;/em&gt; ni&#380; jakie&#347; przypisywanie zmiennych w parametrach formalnych. Sk&#322;adnia Pythona jest tu bardzo intuicyjna. Du&#380;o bardziej ni&#380; dzikie pomys&#322;y z warto&#347;ciami domy&#347;lnymi do parametr&#243;w formalnych wyst&#281;puj&#261;ce &lt;strong&gt;przed&lt;/strong&gt; parametrami wymaganymi.&lt;/p&gt;


	&lt;p&gt;A co do tych dwukropk&#243;w, to one  absolutnie &lt;strong&gt;nic&lt;/strong&gt; nie wnosz&#261; do tematu. Powiedzia&#322;bym, &#380;e s&#261; w og&#243;le nie na temat. To jest przecie&#380; ten sam stary hasz co wcze&#347;niej, tylko &#380;e o pythonowym, a nie perlowym, wygl&#261;dzie. Aktualnie w Ruby 1.9 robi si&#281; tu ma&#322;y burdel, bo hasze maj&#261; teraz dwa rodzaje sk&#322;adni (jedna z dwukropkiem, druga z &lt;code&gt;=&amp;gt;&lt;/code&gt;).&lt;/p&gt;


	&lt;p&gt;Czy Ruby 2 ma u&#380;ywa&#263; dwie sk&#322;adnie haszy, czy starsza sk&#322;adnia wyleci ze standardu? A jak wyleci to co z kluczami b&#281;d&#261;cymi stringami a nie symbolami? W Ruby 1.9 &lt;code&gt;{ foo: 'bar'}&lt;/code&gt; jest tym samym co &lt;code&gt;{ :foo =&amp;gt; 'bar'}&lt;/code&gt;, za&#347; ju&#380; &lt;code&gt;{'foo':'bar'}&lt;/code&gt; wywala  wyj&#261;tek (trzeba wi&#281;c u&#380;y&#263; starej sk&#322;adni &lt;code&gt;{'foo'=&amp;gt;'bar'}&lt;/code&gt;). Dziwactwo jakie&#347; si&#281; porobi&#322;o.&lt;/p&gt;</description>
      <pubDate>Mon, 25 Feb 2008 00:16:14 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:a30c0baf-4437-4d0e-9b68-efeb54419f6a</guid>
      <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem#comment-1417</link>
    </item>
    <item>
      <title>"Po wideokonferencji z Matzem" by lopex</title>
      <description>&lt;p&gt;Z tym pi&#281;knem bym nie przesadza&#322; i wybra&#322; jednak dwukropek. Sk&#322;adnia pythona jest delikatnie m&#243;wi&#261;c nieintuicyjna, kto&#347; mo&#380;e pomy&#347;le&#263; &#380;e to deklaracja zmiennej lokalnej. W Rubym tak jak w lispie wszystko ma warto&#347;&#263; i g&#322;upio by&#322;o by w zale&#380;no&#347;ci od kontekstu zmienia&#263; operator przypisania. Co do haszy nie wypowiadam si&#281;, p&#243;ki co.&lt;/p&gt;</description>
      <pubDate>Sun, 24 Feb 2008 23:04:49 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:3ed389ac-7193-4f32-9fb7-a44025b636db</guid>
      <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem#comment-1416</link>
    </item>
    <item>
      <title>"Po wideokonferencji z Matzem" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;@Radarek: tylko &#380;e nikt nie wie co tam si&#281; znajdzie w tym Ruby 2.0. Matz pokazuje jakie&#347; bezsensowne namiastki i najwyra&#378;niej nie ma pomys&#322;u na ostateczne rozwi&#261;zanie tego problemu. Co do tego przypisania zmiennych w wywo&#322;aniu funkcji Rubiego, to jest to do niczego niepotrzebne. Na miejscu Matza, ja bym to wywali&#322; w Ruby 2.0 i nic by wtedy nie sta&#322;o na przeszkodzie uzyskania  pi&#281;knej, czytelnej sk&#322;adni &lt;em&gt;named parameters&lt;/em&gt; tak, jak to jest w Pythonie.&lt;/p&gt;</description>
      <pubDate>Sun, 24 Feb 2008 00:36:09 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:ad4dca89-40c8-45f7-a8ba-371e4f2ec0e1</guid>
      <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem#comment-1415</link>
    </item>
  </channel>
</rss>
