<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ky6uk&#039;s Blog &#187; Rakudo</title>
	<atom:link href="http://ky6uk.ugatu.net/tag/rakudo/feed" rel="self" type="application/rss+xml" />
	<link>http://ky6uk.ugatu.net</link>
	<description>Мой уютненький...</description>
	<lastBuildDate>Mon, 12 Jul 2010 19:54:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=abc</generator>
		<item>
		<title>День 6: Входя в Гиперпространство</title>
		<link>http://ky6uk.ugatu.net/den-6-vxodya-v-giperprostranstvo?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=den-6-vxodya-v-giperprostranstvo</link>
		<comments>http://ky6uk.ugatu.net/den-6-vxodya-v-giperprostranstvo#comments</comments>
		<pubDate>Tue, 16 Mar 2010 16:31:08 +0000</pubDate>
		<dc:creator>Ky6uk</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[Perl 6]]></category>
		<category><![CDATA[Rakudo]]></category>

		<guid isPermaLink="false">http://ky6uk.ugatu.net/?p=464</guid>
		<description><![CDATA[Вольный перевод шестой статьи цикла Perl 6 Advent Calendar на русский язык. Вчера pmichaud предствавил гипероператоры Perl 6 (рус.). Я хотел бы продолжить обзор этих мощных метаоператоров. Во-первых, я буду использовать вспомогательную функцию lsay для упрощения и красивого вывода списков. sub lsay(@a) { @a.perl.say } Теперь мы можем начать рассматривать примеры гипероператоров. В этой заметке [...]]]></description>
			<content:encoded><![CDATA[<p>Вольный перевод шестой статьи цикла <a href="http://perl6advent.wordpress.com/">Perl 6 Advent Calendar</a> на русский язык.<br />
<span id="more-464"></span><br />
Вчера pmichaud предствавил <a href="http://perl6advent.wordpress.com/2009/12/05/day-5-metaoperator/">гипероператоры Perl 6</a> (<a href="http://ky6uk.ugatu.net/den-5-metaoperatory">рус.</a>). Я хотел бы продолжить обзор этих мощных метаоператоров.</p>
<p>Во-первых, я буду использовать вспомогательную функцию <em>lsay</em> для упрощения и красивого вывода списков.</p>
<pre class="brush: perl;">sub lsay(@a) { @a.perl.say }</pre>
<p>Теперь мы можем начать рассматривать примеры гипероператоров. В этой заметке я буду использовать >> и << вместо » и «, в основном потому, что они легче для моих глаз. (Я боюсь, что потребуется взять очки.) » и «, как правило, считаются истинной записью оператора, но ASCII-версия так же будет работать.</p>
<p>Для начала основы: складываем два списка одинаковой длины:</p>
<pre class="brush: plain;">&gt; lsay (1, 2, 3, 4) &lt;&lt;+&gt;&gt; (3, 1, 3, 1)
[4, 3, 6, 5]
&gt; lsay (1, 2, 3, 4) &gt;&gt;+&lt;&lt; (3, 1, 3, 1)
[4, 3, 6, 5]</pre>
<p>При одинаковой длине массивов нет никакой разницы между этими формами. Но если длина различна:</p>
<pre class="brush: plain;">&gt; lsay (1, 2, 3, 4) &lt;&lt;+&gt;&gt; (3, 1)
[4, 3, 4, 5]
&gt; lsay (1, 2, 3, 4) &gt;&gt;+&lt;&lt; (3, 1)
Non-dwimmy hyperoperator cannot be used on arrays of different sizes or dimensions.</pre>
<p>Как правило, список, на который указывает гипероператор "острым" концом, может быть расширен если он короче чем другой; он расширяется повторением последнего элемента этого списка. В тоже время список, на который указывает "тупой" конец гипероператора, не может быть расширен. Все комбинации разрешены, поэтому вы можете указать на то, что расширена может быть только левая сторона (<<+<<), только правая (>>+>>), обе стороны могут быть расширены (<<+>>), или ни одна из сторон не может быть расширена (>>+<<). Одиночные скаляры так же расширяемы:</p>
<pre class="brush: plain;">&gt; lsay (1, 2, 3, 4) &gt;&gt;+&gt;&gt; 2
[3, 4, 5, 6]
&gt; lsay 3 &lt;&lt;+&lt;&lt; (1, 2, 3, 4)
[4, 5, 6, 7]</pre>
<p>В основном, гипероператоры используются с инфиксными операторам. Теоретически, вы так же можете использовать их с префиксными или постфиксными операторами:</p>
<pre class="brush: plain;">&gt; lsay ~&lt;&lt;(1, 2, 3, 4)
[&quot;1&quot;, &quot;2&quot;, &quot;3&quot;, &quot;4&quot;]
&gt; lsay (1, 2, 3, 4)&gt;&gt;++
[2, 3, 4, 5]</pre>
<p>На практике такое использование не было осуществлено в <a href="http://rakudo.org/">Rakudo</a>, за исключением одного особого случая:</p>
<pre class="brush: plain;">&gt; lsay (0, pi/4, pi/2, pi, 2*pi)&gt;&gt;.sin
[0, 0.707106781186547, 1, 1.22464679914735e-16, -2.44929359829471e-16]
&gt; lsay (-1, 0, 3, 42)&gt;&gt;.Str
[&quot;-1&quot;, &quot;0&quot;, &quot;3&quot;, &quot;42&quot;]</pre>
<p>То есть >>. вызывает метод <em>Str</em> на каждом элементе списка.</p>
<p>Насколько бы вам не хотелось написать <em>@array>>.say</em>, не делайте этого. Это может работать в текущей версии Rakudo, но при использовании гипероператоров вы обещаете что операция параллелизуема, и порядок операций на списке(-ах) не фиксирован. Надеюсь, что в будущих версиях Perl 6 эти операции будут выполняться параллельно.</p>
<p>Другие примечания: Гипероператоры работают не только со встроенными операторами. Они будут работать с любым новым оператором который вы определите. (В основном, сейчас это уже работает в Rakudo.) Гипероператоры будут работать с in-place операторами, напрмиер <em>@a >>/=>> 2</em> разделит весь массив на 2. (Это не работает в текущей версии Rakudo.) Они будут работать с многомерными списками, с деревьями и с хэшами; смотрите <a href="http://perlcabal.org/syn/S03.html#Hyper_operators">S03 Hyper operators</a>. (Насколько я знаю, они еще не работают в Rakudo.)</p>
<p>Я больше не знаю примеров использования, но область применения гипероператоров достаточно широка. Например класс <a href="http://github.com/LastOfTheCarelessMen/Vector/blob/master/lib/Vector.pm">Vector</a> написанный <a href="http://github.com/LastOfTheCarelessMen">LastOfTheCarelessMen</a> довольно неплох — это реализация N-мерного вектора без единой явной петли.</p>
<p>&copy; <a href="http://perl6advent.wordpress.com/2009/12/06/day-6-going-into-hyperspace/">Оригинальная статья.</a></p>
<h3  class="related_post_title">Похожие статьи</h3><ul class="related_post"><li><a href="http://ky6uk.ugatu.net/den-1-poluchaem-rakudo" title="День 1: Получаем Rakudo">День 1: Получаем Rakudo</a></li><li><a href="http://ky6uk.ugatu.net/den-8-raschesyvaem-ogranicheniya" title="День 8: расчесываем ограничения">День 8: расчесываем ограничения</a></li><li><a href="http://ky6uk.ugatu.net/den-7-cikly-dlya-polzy-i-razvlecheniya" title="День 7: Циклы для пользы и развлечения">День 7: Циклы для пользы и развлечения</a></li><li><a href="http://ky6uk.ugatu.net/den-5-metaoperatory" title="День 5: Метаоператоры">День 5: Метаоператоры</a></li><li><a href="http://ky6uk.ugatu.net/den-4-testirovanie" title="День 4: Тестирование">День 4: Тестирование</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ky6uk.ugatu.net/den-6-vxodya-v-giperprostranstvo/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>День 1: Получаем Rakudo</title>
		<link>http://ky6uk.ugatu.net/den-1-poluchaem-rakudo?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=den-1-poluchaem-rakudo</link>
		<comments>http://ky6uk.ugatu.net/den-1-poluchaem-rakudo#comments</comments>
		<pubDate>Mon, 07 Dec 2009 23:47:56 +0000</pubDate>
		<dc:creator>Ky6uk</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Perl 6]]></category>
		<category><![CDATA[Rakudo]]></category>

		<guid isPermaLink="false">http://ky6uk.ugatu.net/?p=341</guid>
		<description><![CDATA[Как я и планировал, выкладываю перевод первой статьи цикла Perl 6 Advent Calendar. Напоминаю, что перевод вольный, по-этому сильно придираться не стоит. Существует много разных частичных реализаций Perl 6. Наиболее полной на данный момент является Rakudo. Для получения Rakudo и дальнейшей работы с ним есть несколько путей, но если вас интересует помощь в разработке и отслеживание [...]]]></description>
			<content:encoded><![CDATA[<p>Как я и <a href="http://ky6uk.ugatu.net/perl-6-advent-calendar-na-russkom">планировал</a>, выкладываю перевод <a href="http://perl6advent.wordpress.com/2009/12/01/day-1-getting-rakudo/">первой</a> статьи цикла <a href="http://perl6advent.wordpress.com/2009/12/01/perl-6-advent-calendar/">Perl 6 Advent Calendar</a>. Напоминаю, что перевод вольный, по-этому сильно придираться не стоит.<br />
<span id="more-341"></span><br />
Существует много разных частичных реализаций Perl 6. Наиболее полной на данный момент является <a href="http://rakudo.org/">Rakudo</a>. Для получения Rakudo и дальнейшей работы с ним есть несколько путей, но если вас интересует помощь в разработке и отслеживание текущего статуса, то наилучшим вариантом будет получение и сборка Rakudo непосредственно из актуальных исходных кодов.</p>
<p>Для этого вам понадобятся <a href="http://subversion.tigris.org/">Subversion (svn)</a>, <a href="http://git-scm.com/">git</a>, Perl 5.8 или новее, компилятор языка C и утилита make. В Linux-подобных операционных системах (включая OS X) собрать Rakudo можно следующим образом:</p>
<pre class="brush: plain;">$ git clone git://github.com/rakudo/rakudo.git
$ cd rakudo
$ perl Configure.pl --gen-parrot
$ make
$ make test
$ make install</pre>
<p>Здесь опция &#8211;gen-parrot указывает Subversion получить сответствующую версию виртуальной машины <a href="http://www.parrot.org/">Parrot</a> и затем компилирует её.</p>
<p>Для текущего Rakudo, make install не установит его в ваше окружение, это фактически подготовит систему так, что вы сможете запускать исполняемый файл perl6 (созданный в директории rakudo) из любой другой директории. После этого вы можете &laquo;поиграть&raquo; с Perl 6, запустив perl6 без аргументов, что позволит войти в среду <a href="http://ru.wikipedia.org/wiki/REPL">REPL</a>, где можно непосредственно вводить команды и видеть что они делают. Это может быть невероятно удобным для ознакомления с работой Perl 6.<br />
Например:</p>
<pre class="brush: plain;">$ ./perl6
&gt; say &quot;Hello world!&quot;;
Hello world!
&gt; say (10/7).WHAT
Rat()
&gt; say [+] (1..999).grep( { $_ % 3 == 0 || $_ % 5 == 0 } );
233168</pre>
<p>Начинающиеся на $ и &gt; строки &#8211; это то, что вы вводите; другие строки &#8211; это ответ Rakudo. Первый пример просто выводит текст с помощью say. Второй создаёт рациональное число и запрашивает его тип. Третий создаёт список чисел от 1 до 999, о<span onmouseover="_tipon(this)" onmouseout="_tipoff()">тфильтровывает те, которые не делятся на 3 или 5, суммирует их и выводит результат. (Это первая задача <a href="http://projecteuler.net/">проекта Эйлера</a>, спасибо <a href="http://transfixedbutnotdead.com/2009/11/30/eulergy/">draegtun</a> за напоминание.) Мы постараемся объяснить как работают эти вещи в будущих постах.</span></p>
<p><span onmouseover="_tipon(this)" onmouseout="_tipoff()">И еще одно замечание. Если у вас возникли трудности в получении Rakudo, то канал #perl6 на </span>irc.freenode.net может оказаться весьма полезным.</p>
<p><a href="http://perl6advent.wordpress.com/2009/12/01/day-1-getting-rakudo/">Оригинальный текст</a>.</p>
<h3  class="related_post_title">Похожие статьи</h3><ul class="related_post"><li><a href="http://ky6uk.ugatu.net/den-6-vxodya-v-giperprostranstvo" title="День 6: Входя в Гиперпространство">День 6: Входя в Гиперпространство</a></li><li><a href="http://ky6uk.ugatu.net/den-8-raschesyvaem-ogranicheniya" title="День 8: расчесываем ограничения">День 8: расчесываем ограничения</a></li><li><a href="http://ky6uk.ugatu.net/den-7-cikly-dlya-polzy-i-razvlecheniya" title="День 7: Циклы для пользы и развлечения">День 7: Циклы для пользы и развлечения</a></li><li><a href="http://ky6uk.ugatu.net/den-5-metaoperatory" title="День 5: Метаоператоры">День 5: Метаоператоры</a></li><li><a href="http://ky6uk.ugatu.net/den-4-testirovanie" title="День 4: Тестирование">День 4: Тестирование</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ky6uk.ugatu.net/den-1-poluchaem-rakudo/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
