<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:blogChannel="http://backend.userland.com/blogChannelModule">

<channel>
<title><![CDATA[Perl 6: Perl 6 Tutorial Part 8]]></title>
<link>http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_8</link>
<description></description>
<pubDate>Fri, 06 Aug 2010 23:52:22 -0000</pubDate>
<webMaster>synedra@gmail.com</webMaster>
<generator>Socialtext Workspace v2.14.7.2</generator>

<item>
<title><![CDATA[Perl 6 Tutorial Part 8]]></title>
<link>http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_8</link>
<description><![CDATA[<div class="wiki">
<div class="nlw_phrase"><table class='toc'><tr><td><div class="wiki">
<h3 id="contents">Contents: []</h3>
<ul>
<li><span class="nlw_phrase"><a title="section link" href="#wozu_metaprogrammierung">Wozu Metaprogrammierung?</a><!-- wiki: {link: [] Wozu Metaprogrammierung?} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#wo_beginnt_metaprogrammierung">Wo beginnt Metaprogrammierung ?</a><!-- wiki: {link: [] Wo beginnt Metaprogrammierung ?} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#die_wunderbare_welt_der_macros">Die wunderbare Welt der Macros</a><!-- wiki: {link: [] Die wunderbare Welt der Macros} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#da_entlang_alice">Da entlang Alice</a><!-- wiki: {link: [] Da entlang Alice} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#zeig_mir_dein_inneres">Zeig mir dein Inneres!</a><!-- wiki: {link: [] Zeig mir dein Inneres!} --></span></li>
<li><span class="nlw_phrase"><a title="section link" href="#was_sich_sonst_noch_tat">Was sich sonst noch tat</a><!-- wiki: {link: [] Was sich sonst noch tat} --></span></li>
</ul>
</div>
</td></tr></table><!-- wiki: {toc: } --></div><br /><br /><p>
Herzlich willkommen auch zum achten und letzten Teil dieses tiefsch�rfenden<br />
Tutoriums f�r werdende Perl 6-Programmierer. Diesmal wird es sogar noch eine Ebene<br />
tiefer gehen, zu den Interna der Sprache und wie sie befragt und ver�ndert werden.<br />
Da diese Bereiche st�rker theorielastig sind und von Pugs und Rakudo bisher kaum<br />
implementiert werden, besteht diese Folge aus mehr Text und weniger Beispielen<br />
als �blich.</p>
<h3 id="wozu_metaprogrammierung">Wozu Metaprogrammierung?</h3>
<p>
Von Anfang an ging es bei diesem Projekt nicht nur darum vergangene Irrt�mer<br />
auszub�geln und den aktuellen Stand dynamischer Sprachen in vielem wieder ein- und<br />
�berholen. Perl 6 sollte auch nach l�ngerer Reifung ebenfalls lange halten. Was<br />
bedeutet, da� die Sprache f�hig sein mu�, k�nftige Anpassungen zu unterst�tzen,<br />
ohne das die Implementation des Interpreters angefasst werden wird. Einfacher<br />
gesagt: Perl 6 sollte bessere M�glichkeiten der Metaprogrammierung erhalten,<br />
als die derzeit ber�chtigten I&lt;Sourcefilter&gt;, die abgeschafft wurden, da sie viel<br />
zu langsam und fehleranf�llig sind, um in echtem Produktionscode eingesetzt zu werden.</p>
<p>
Das ganze hat aber noch eine anderen Grund. Viele der weitverbreiteten Sprachen<br />
haben etliche Varianten oder auch Ableger, da verschiedene Fachbereiche oder<br />
Anwendergruppen verschiedene Betrachtungsweisen kennen oder bevorzugen.<br />
Um die Aufsplitterung von Perl in Derivate wie es z.B. mit PHP geschah zu verhindern,<br />
mu� Perl noch wandlungsf�higer werden.<br />
Und nur eine gemeinsame Basis macht eine Infrastruktur und damit alle Beteiligten<br />
wirklich m�chtig (siehe CPAN).<br />
Gerade in den letzten Jahren wird das mit dem Modewort I&lt;domain specific language&gt;<br />
(DSL) zusammengefasst, wenn Sprachen einer Aufgabenstellung angepasst werden k�nnen,<br />
um diese effektiv und f�r die mit der Materie Vertrauten verst�ndlich zu l�sen.<br />
Flexibilit�t (TIMTOWTDI) hatte sich Perl schon immer auf die Fahnen geschrieben<br />
und dies wird mit Perl 6 nur noch etwas weiter getrieben. Perl 6 ist in Wirklichkeit<br />
eine Metaprogrammiersprache, die sich zur Laufzeit in fast alles Denkbare verwandeln<br />
kann. Dies ist in Ordnung so, mein Larry Wall, da alles erlaubt sein soll,<br />
wenn man es vorher explizit deklariert. Und Lernende werden mit einem ausgewogenem<br />
Satz vordefinierter Befehle zu einem &quot;guten Stil&quot; angeleitet, bis sie f�hig werden,<br />
alle Regeln zu ver�ndern. Und je mehr sie lernen diese Regeln zu ihrem Vorteil<br />
zu �ndern, umso k�rzer, effektiver und oft auch lesbarer werden ihre Programme.</p>
<p>
Dieser Ansatz bringt nicht nur Freiheit f�r den Programmierer sondern erlaubt die<br />
immer komplexer werdenden Softwaresysteme kompakter und beherrschbarer zu schreiben.<br />
Ein Blick in die Java-Welt zeigt die Nachteile hierarchisch-logischer Strukturen,<br />
die oft zu unbeweglich und �berladen und damit schwer lesbar und ver�nderbar sind.<br />
Aber selbst in der Welt von Perl und Ruby lernte man in den letzten Jahren, da�<br />
die zuerst gepriesenen Web-Frameworks schnell sehr umfangreich werden. Jedes ist<br />
eine Welt f�r sich, die erlernt sein will, obwohl sich viel Funktionalit�t �hnelt.<br />
Deshalb entstanden in letzer Zeit mit Rack, Mojo und anderen Unterfangen Software,<br />
die sich auf einzelne Probleme konzentriert, um diese in logischen Einheiten mit<br />
eine m�glichst einfachen API handhabbar zu halten. Die Idee dahinter ist nicht neu,<br />
denn Perl 1.0 brachte Shellbefehle in die C-Syntax brachte, um komplexere Probleme<br />
kurz und und dem menschlichen Denken nah zu l�sen. Sp�ter erf�llten in Perl 5.n<br />
gute Module den gleichen Zweck, nur das sie bereits von Programmierern der Sprache<br />
zugef�gt werden konnten, ohne den C-Quellcode von Perl anzufassen. Das neue Perl 6<br />
ist eine logische Fortsetzung dieser Entwicklung zu einer Sprache die quasi &quot;fl�ssig&quot; ist,<br />
und in verschiedene Situationen die Syntax annehmen kann, der dem Ideal des Benutzers<br />
entspricht. Dadurch fallen Barrieren, die bisher durch Programmiersprachgrenzen<br />
aufgestellt wurden. Gro�e Systeme bestehen zunehmend aus Teilen die in verschiedenen<br />
Sprachen und Versionen geschrieben wurden, die sich nur in Details unterscheiden<br />
k�nnen, aber dennoch von zus�tzlicher I&lt;Middleware&gt; &quot;zusammengehalten&quot; werden m��en.<br />
Diese Teilsystem werden oft kaum mehr angefasst, da sie ausgereift, zuverl��ig<br />
aber nicht immer leicht wartbar und auch nicht leicht erneuerbar sind. Deshalb<br />
wachsen diese Flickenteppiche zu ungeahnten Komplexit�ten und es gibt bereits<br />
Lehrst�hle f�r Professoren, die Menschen beibringen wollen mit solchen Unget�men<br />
umzugehen. Besser w�re es doch, wenn solche Software gleich in Perl 6, vielleicht<br />
auch Ruby oder Lisp geplant wird, um diese Komplexit�t nicht entstehen zu lassen.<br />
Und selbst wenn &quot;unber�hrbare&quot; Software Teil einer Anwendung ist, kann eine sehr<br />
anpassungsf�hige Sprache Kommunikation mit wenig Programmieraufwand erm�glichen,<br />
und Perl bleibt was es immer war: eine I&lt;glue-language&gt;.</p>
<h3 id="wo_beginnt_metaprogrammierung">Wo beginnt Metaprogrammierung ?</h3>
<p>
Wenn eine kleine I&lt;sub&gt; den verf�gbaren Wortschatz erweitert, ist das bereits<br />
Metaprogrammierung? Das kommt auf den Fall an. Subroutinen k�nnen dazu verwandt<br />
werden etwas Ordnung in Spaghetticode zu bringen, was unter das Schlagwort<br />
&quot;strukturierte Programmierung&quot; f�llt. Da die Errungenschaften von C&lt;if&gt;, C&lt;while&gt;<br />
und Routinen seit den 70er-Jahren Allgemeingut wurden, f�llt der Begriff heute selten.<br />
Wesentlich h�ufiger h�rt man dieser Tage dagegen das Wort &quot;funktionale Programmierung&quot;.<br />
So hei� ein Programmierstil der sehr abstrakt ist und daher in die Metaprogrammierung<br />
hineinragt. Mark Jason Dominus beschreibt in &quot;Higher Order Perl&quot; genauer wie das<br />
in Perl aussieht (Buchrezension in $foo Winter/2008). Das Buch ist wohl zum Teil<br />
nach den &quot;Higher Order Functions&quot; benannt. Das sind Routinen die eine Aufgabe<br />
sehr abstrakt l�sen und deshalb sehr vielseitig einsetzbar sind. Viele Perlianer<br />
verwenden bestimmt solche &quot;Higher Order Functions&quot;, ohne den Begriff zu kennen.<br />
Z.B. C&lt;map&gt; und C&lt;grep&gt; fallen in diese Kategorie. Aber mit Perl 5.0 konnte man<br />
auch bereits selber solche Functionen schreiben, da schachtelbare Namensr�ume f�r<br />
Variablen und Codereferenzen als Parameter anwendbar waren. �hnlich der OOP war<br />
in Perl 5 fast alles m�glich, nur vieles jetzt einfacher. Eine wichtige Technik<br />
in der funktionalen Programmierung ist z.B. das I&lt;Currying&gt;. Auf deutsch: das <br />
Erstellen einer Codereferenz auf eine Funtion h�herer Ordnung (einen Alias), bei<br />
der bestimmte Parameter festgelegte Werte haben und nur die restlichen Parameter<br />
bestimmt werden k�nnen. Also wenn eine Funktion C&lt;potenz&gt; beliebige Potenzen<br />
berechnet(ja es ginge auch mit C&lt;**&gt;, aber folgender Code entspricht einem<br />
funktionalem L�sungsansatz):</p>
<p>
	subset Num+ of Num where { $_ &gt; 0 };<br />
	subset Num- of Num where { $_ &lt; 0 };<br />
	subset Zero of Num where { $_ == 0 };</p>
<p>
	multi sub potenz (Num :$basis!, Zero :$exponent!) {<br />
		return 1;<br />
	}</p>
<p>
	multi sub potenz (Num :$basis!, Num- :$exponent!) {<br />
		return 1 / potenz( $basis, -$exponent);<br />
	}</p>
<p>
	multi sub potenz (Num :$basis!, Num+ :$exponent!) {<br />
		return $exponent * potenz( $basis, $exponent - 1 );<br />
	}</p>
<p>
Ein Funktion C&lt;quadrier&gt; w�rde ich nun explizit wie folgt erhalten:</p>
<p>
	&amp;quadrier := &amp;potenz.assuming( exponent =&gt; 2 );<br />
	# alternative Schreibweise:<br />
	&amp;quadrier := &amp;potenz.assuming( :exponent(2) );</p>
<p>
Die l��t sich wie erwartet aufrufen:</p>
<p>
	say quadrier(5); # ergibt 25</p>
<p>
C&lt;.assuming&gt; (englisch f�r angenommen) dr�ckt in einer Alltagssprache genau aus<br />
worum es hier geht: C&lt;quadrier&gt; entspricht C&lt;potenz&gt;, unter der Annahme, da� der<br />
Exponent 2 ist. Das C&lt;:=&gt; ist keine Zuweisung sondern ein I&lt;binding&gt;. P6 kennt<br />
weder direkten Manipulation der Symboltabelle mit Typeglobs noch Referenzen (der<br />
Schr�gstrich (I&lt;backslash&gt;) erzeugt jetzt I&lt;captures&gt;, siehe Teil 6). Um einen<br />
Alias auf den Inhalt einer Variable zu erhalten, bindet man diese Variable mit<br />
C&lt;:=&gt; an eine Andere.</p>
<p>
	my $planeten = 7;<br />
	my $planety := $planeten;<br />
	$planeten = 9;<br />
	say $planety; # gibt 9<br />
	say &quot;yes&quot; if $planety =:= $planeten;</p>
<p>
Das letzte Beispiel f�hrt die Ausgabe aus, da die Variablen an das gleiche Objekt<br />
gebunden sind. Ein Binden zur Kompilierungszeit mit der Schreibweise C&lt;::=&gt; mag<br />
selten gebraucht werden, aber das Ausf�hren von Routinen zum fr�hstm�glichen<br />
Zeitpunkt wesentlich �fter. In Perl 5 schrieb man dazu den Code in einen BEGIN-Block,<br />
was weiterhin m�glich ist, aber Perl 6 kennt noch ein anderes Konzept, das dem<br />
�hnelt, aber weitaus m�chtiger ist. Manche behaupten sogar, da� vor allem diese<br />
Macros LISP m�chtiger machen als alle anderen Sprachen, was in den 60er und 70er<br />
Jahren auch gestimmt haben mag.</p>
<h3 id="die_wunderbare_welt_der_macros">Die wunderbare Welt der Macros</h3>
<p>
Macros sind (wie angedeutet) Routinen, die beim Kompilieren ausgef�hrt werden.<br />
Im Gegensatz zu einer C&lt;sub&gt;, �ndern sie die Sprache, da sie statt eines Wertes,<br />
einen AST (Baumstruktur, die als Zwischenform beim Kompilieren entsteht) liefern,<br />
der beim Kompilieren anstelle jedes Macroaufrufes in den AST des Programmes<br />
eingef�gt wird, bevor die Ausf�hrung beginnt.</p>
<p>
In C ist das bei weitem einfacher. Hier sind Macros lediglich Textbausteine die<br />
an die mit dem Makronamen markierten Stellen im Quellcode eingef�gt werden, bevor<br />
der Kompiler sein Werk beginnt. Die alten Perl 5-Sourcefilter taten ihr Unwesen<br />
nach dem gleichen Prinzip, nur da� hier die volle Kraft der P5-Regex am Werke war.<br />
Das kann subtile, schwer zu entdeckende Fehler erzeugen, da jeder Macroprozessor<br />
blind f�r die Bedeutung der Sprachsyntax ist und der von ihm erstellte Quelltext<br />
nirgends einsehbar ist. Perl 6-Macros haben standardm��ig (wie alle Bl�cke) keine<br />
Seiteneffekte auf die lexikalische Struktur der umgebenden Quellen.<br />
So etwas nennt die Fachwelt: hygienische Macros. Folgende Makros sind hygienisch:</p>
<p>
	macro summe { 3 + 4 }<br />
	macro summe { '3 + 4' }<br />
	macro summe is parsed { 3 + 4 }</p>
<p>
C&lt;parsed&gt; ist ein Trait von Routinen da� nur Macros wirklich ben�tigen, aber da<br />
es default ist, kann es auch weggelassen werden. Und auch die Verwendung der <br />
Macros ist denkbar einfach.</p>
<p>
	say 2 * summe; # 14<br />
	say 2 * summe(); # 14<br />
	say 2 * &amp;summe(); # 14</p>
<p>
Auch wenn alle Aufrufe C&lt;14&gt; ergeben, so sind sie nicht identisch, da der dritte<br />
erst zur Laufzeit aufgel�st wird. Doch manchmal sind dreckige Macros genau was<br />
man m�chte und dann schreibt man.</p>
<p>
	macro summe is reparsed { 3 + 4 }</p>
<p>
Wird dieses Macro im vorigen Beispiel aufgel�st, hie�e das Ergebnis C&lt;10&gt;.<br />
Denn dieses Macro gibt nur einen String zur�ck, der zusammen mit dem umgebenden<br />
Quellcode compiliert wird. Dabei gilt die alte Regel: Punkt- vor Strichrechnung.<br />
Da diese Funktionsweise derartige Probleme provoziert, hat sie die beschriebene<br />
Kindersicherung und es wird standardm��ig von Macros ein AST zur�ckgegeben.<br />
Aber auch au�erhalb von Macros kann dies getan werden. I&lt;quoting&gt; mit dem Adverb<br />
C&lt;:code&gt; (siehe letzte Folge) und ein C&lt;quasi&gt; vor geschweiften Klammern oder <br />
Anf�hrungszeichen kann das (I&lt;quasiquoting&gt;) bewirken.</p>
<p>
	return quasi { say &quot;foo&quot; };<br />
	return Q :code / say &quot;foo&quot; /;</p>
<p>
Beide Zeilen liefern keine Referenz auf eine Routine sondern ein kompiliertes<br />
St�ck Programm. Folglich ist ein Macro eine zu C&lt;BEGIN&gt; ausgef�hrte Routine<br />
deren R�ckgabewert derart C&lt;quasi&gt; kommentiert (I&lt;gequoted&gt;) ist. Dies ist eine<br />
sehr elegante Eigenschaft von Perl 6, da� jedes Sprachelement mit den Bordmitteln<br />
der Sprache beschrieben werden kann. Deswegen kann die Syntax, so reichhaltig sie<br />
auch scheinen mag, auf einen wesentlich kleineren Kern reduziert werden, aus dem<br />
sich beliebige Sprachen aufbauen lassen. Deshalb gilt f�r Perl 6 was John Foderaro<br />
einst �ber Lisp sagte: &quot;es ist eine programmierbare Programmiersprache&quot;.<br />
Weil Perl syntaktisch viel reichhaltiger als Lisp ist, da� nur Funktionsnamen,<br />
Wertelisten und runde Klammern kennt, m��en Perl-Macros wesentlich mehr k�nnen,<br />
um wirklich alle Sprachbestandteile erweitern zu k�nnen. Einen neuer Operator<br />
(z.B. f�r die mathematische Fakult�t-Funktion) wird so erzeugt:</p>
<p>
	macro postfix:&lt;!&gt; { <a href="http://www.perlfoundation.org/perl6/index.cgi?*" title="[click to create page]" class="incipient">*</a> 1..$^n }<br />
	macro postfix:('!') { <a href="http://www.perlfoundation.org/perl6/index.cgi?*" title="[click to create page]" class="incipient">*</a> 1..$^n }</p>
<p>
Das gew�hlte Operatorsymbol kann auch in andere Klammern als den Spitzen geh�llt<br />
sein, aber der Vorsatz &quot;postfix:&quot; ist entscheidend, da wir einen Postfix-Operator,<br />
also einen nachgestellten Operator (wie in C&lt;$p++&gt;) definieren wollen. Um noch zu<br />
bestimmen wo der neue Operator seinen Platz in der Vorrangtabelle hat, k�nnte man<br />
hinzuf�gen:</p>
<p>
	macro postfix:&lt;!&gt; is equiv(&amp;postfix:&lt;++&gt;) { ... }</p>
<p>
Das k�nnte man auch mit C&lt;is tighter&gt; oder C&lt;is looser&gt; definieren. Dann bek�me<br />
der Operator eine eigene Spalte in der Vorrangtabelle die jeweils �ber oder unter<br />
dem angegebenen Operator liegt.</p>
<p>
Diesem Schema entsprechend gibt es eine lange Reihe von Schl�sselw�rter die jede<br />
Art von Operator oder Schl�sselwort bezeichnen. Es lassen sich eigne Arten des<br />
I&lt;Quoting&gt;, Regex-Befehle, Spezialvariablen oder neue sekund�re Sigils einf�hren.<br />
Wenn jemand XML-Kommentare in seinem Perl haben m�chte so reicht ein:</p>
<p>
	macro circumfix:�&lt;!-- --&gt;� ($text) is parsed / .*? / { &quot;&quot; }</p>
<p>
C&lt;$text&gt; ist der Parameter, der den Text zwischen den Kommentarzeichen beinhaltet.<br />
Nach dem C&lt;is parsed&gt; steht die Regex mit der geparsed werden soll. In diesem<br />
Fall hat das &lt;reparsed&gt; den Vorteil, da� die Regex mit Regeln formuliert werden<br />
kann die erst sp�ter definiert werden.</p>
<h3 id="da_entlang_alice">Da entlang Alice</h3>
<p>
Aber die Manipulation der Sprache kennt noch eine Ebene. Es ist sogar m�glich<br />
die Regeln zu �ndern mit denen der Interpreter den Quellcode einliest. Seine<br />
Arbeitsweise wird in der STD.pm mit der Hilfe von P6-Regex-Grammatiken definiert.<br />
Wie diese formuliert werden und aufgebaut sind, behandelte die letzte Folge.</p>
<p>
Intern wird die Sprache in mehrere Teilsprachen (&quot;slangs&quot;) gegliedert. <br />
Die Kernsprache ist z.B. eine Grammatikobjekt, auf das mit C&lt;$~MAIN&gt; zugegriffen<br />
werden kann. Die Regeln f�r das Kommentieren stehen unter C&lt;$~Q&gt;.<br />
Und die Regex die bestimmen wie Regex einzulesen sind, finden sich unter C&lt;$~Regex&gt;.<br />
C&lt;~&gt; ist die Twigil dieser Sondervariablen. Und da Grammatiken nach au�en normale<br />
Objekte sind, k�nnen sie abgeleitet und ver�ndert werden wie jedes andere Objekt<br />
auch. S�mtliche �nderungen gelten nur f�r den aktuellen Namensraum (I&lt;scope&gt;)<br />
und die I&lt;defaults&gt; k�nnen jederzeit wiederhergestellt werden, da sie unter<br />
C&lt;%?LANG&gt; gespeichert sind.</p>
<h3 id="zeig_mir_dein_inneres">Zeig mir dein Inneres!</h3>
<p>
Objekte k�nnen in Perl 6 sehr stark durchleuchtet und ver�ndert werden. Jede<br />
Elternklasse, jede Methode und jede Signatur (mit C&lt;$obj.methode.signature&gt;) kann<br />
abgefragt oder verschiedenst gepr�ft werden. C&lt;$obj.WHERE&gt; nennt die Speicheradresse,<br />
C&lt;.WHAT&gt; den Typ, was in etwa dem Befehl C&lt;ref&gt; in Perl 5 entspricht.</p>
<p>
Es lassen sich mit Roles beliebige Methoden zu Laufzeit in ein Objekt einf�gen,<br />
aber der direkteste Weg daf�r ist wohl:</p>
<p>
	augment slang Regex {<br />
		token regex_metachar:&lt;^&gt; { ... }<br />
	}</p>
<p>
C&lt;augment&gt; (englisch f�r einblenden) f�gt nur Regeln (Methoden) in die Grammatik<br />
(Klasse) ein, soll eine gesamte Slangdefinition ausgetauscht werden, dann ist <br />
C&lt;supersede&gt; (englisch f�r �berlagern) das Mittel der Wahl.</p>
<p>
Es gibt noch viele weitere Sondervariablen, wie f�r den umgebenden Block<br />
(C&lt;&amp;?BLOCK&gt;) oder die umgebende Routine (C&lt;&amp;?ROUTINE&gt;) mit denen sich weit mehr<br />
tun l��t als noch in Perl 5, z.B. lassen sich alle Sprungmarken im aktuellen Block<br />
mit C&lt;&amp;?BLOCK.labels&gt; auflisten. Auch C&lt;&amp;?ROUTINE.name&gt; ist praktisch, wenn man<br />
nicht merh wei� wo sich die Ausf�hrung gerade befindet. Doch dies sieht man alles<br />
in den Tabellen im Anhang B meines Wiki-Kompendiums, siehe Artikelende.</p>
<h3 id="was_sich_sonst_noch_tat">Was sich sonst noch tat</h3>
<p>
Zu Beginn dieses Tutorials k�ndigte ich an, mit jedem Teil auch alle �nderungen<br />
bereits erw�hnter Syntax zu dokumentieren. Doch zum Gl�ck waren es weit weniger,<br />
als angenommen, soda� eine kleine Aktualisierung am Ende des letzten Teils gen�gt.<br />
Gleich im ersten Teil wies ich auf eine potentielle Stolperfalle:</p>
<p>
	$b = =$a; # Zuweisung einer Zeile aus einem Datenstrom<br />
	$b == $a; # numerischer Vergleich</p>
<p>
Diese ist mittlerweile behoben, denn der prefixe Operator C&lt;=&gt; wurde ersatzlos<br />
gestrichen. Statt dessen sollte man die Methoden C&lt;.lines&gt; und C&lt;.get&gt; verwenden.<br />
C&lt;.lines&gt; liefert einen Iterator und C&lt;.get&gt; tats�chlich Textzeilen.</p>
<p>
	my $name = &quot;artikel.txt&quot;;<br />
	my $handle = $name.open err die &quot;Kann '$name' nicht �ffnen: $!&quot;;<br />
	my $ganzer_inhalt = $handle.slurp;</p>
<p>
	for $handle.lines <del>&gt; $zeile { ... }<br />
	while $handle.get</del> &gt; $zeile { ... }<br />
	$zeile = $handle.get;<br />
	$handle.close;</p>
<p>
Da der Kopf einer C&lt;while&gt;-Schleife im Skalarkontext und C&lt;eager&gt; evaluiert wird,<br />
w�rde C&lt;.lines&gt; dort einen Array mit allen Zeilen liefern. Da jedoch C&lt;for&gt; den<br />
Arraykontext forciert der standartm��ig C&lt;lazy&gt; ist, wird dort bei jeder Iteration<br />
jeweils eine Zeile �berwiesen. Im Skalarkontext w�rden alle Zeilen mit C&lt;~&gt;<br />
verbunden geliefert.</p>
<p>
Der neue Metaoperator C&lt;R&gt; kam hinzu. Er vertauscht lediglich die Operanden,<br />
R steht f�r I&lt;reverse&gt; (englisch r�ckw�rts).</p>
<p>
	say 3 R- 4; # sagt 1<br />
	say 2 R** 3; # sagt 9</p>
<p>
Der Kreuz-Metaoperator wurde vereinfacht. Von nun an reicht es dem Operator ein<br />
C&lt;X&gt; voranzustellen, vorher hie� das noch z.B. C&lt;X~X&gt;.</p>
<p>
	&lt;a b&gt; X~ &lt;1 2&gt; # &lt;a1 a2 b1 b2&gt;</p>
<p>
Der Hyper-Metaoperator l��t sich aber nicht so vereinfachen, da die Pfeile<br />
(&lt;&lt; und &gt;&gt;) bestimmen, wie der Operator auf Dimensionalit�t der jeweiligen Seite<br />
reagieren soll.</p>
<p>
Neben autogenerierten positionalen Parametern (erkennbar an der twigil C&lt;^&gt;), gibt<br />
es nun autogenerierte benannte Parameter, deren Twigil C&lt;:&gt; sich nahtlos in die<br />
Syntax zur Deklarierung benannter Parameter einf�gt.</p>
<p>
Selbstverst�ndlich gab es noch weit mehr �nderungen, doch diese sind oft subtiler<br />
oder liegen au�erhalb der behandelten Themen. Einen tieferen Einblick gew�hrt das<br />
Tutorial in der Wiki der deutschen Perl-Community unter<br />
L&lt;wiki.perl-community.de/cgi-bin/foswiki/view/Wissensbasis/PerlTafel&gt;,<br />
oder einfacher zu tippen: L&lt;de.perl.org&gt; und dann auf Wiki &gt; Wissensbasis &gt; Tutorials<br />
klicken. Viele hilfreiche Texte beinhaltet auch die Seiten von Moritz Lentz unter<br />
L&lt;perl-6.de&gt;. Dieses Tutorial wurde jetzt in eine Wiki online gestellt unter:<br />
L<a target="_blank" title="(external link)" href="http://wiki.perl-community.de/cgi-bin/foswiki/view/Wissensbasis/Perl6Tutorial">http://wiki.perl-community.de/cgi-bin/foswiki/view/Wissensbasis/Perl6Tutorial</a><br />
und kann nun von jedem kommentiert und verbessert werden. Ich habe vor es weiter<br />
zu verbessern und auch ins Englisch zu �bersetzen, wo es in der Wiki der TPF<br />
unter L[perl tablets] zu finden sein wird.</p>
<hr />
<p>
<a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_7" title="(33 months)  toc Text, Rules and Grammars Willkommen zum siebenten Teil dieses poetischen Perl 6-Tutorials, da v...">Previous Chapter<!-- wiki-renamed-link Perl 6 Tutorial Part 7 --></a> | <a href="http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial" title="(38 months) This tutorial was written for foo Perl magazine http perl-magazin.de and was published from winter 2...">Overview<!-- wiki-renamed-link Perl 6 Tutorial --></a></p>
</div>
]]></description>
<author>Herbert Breunung</author>
<guid isPermaLink="true">http://www.perlfoundation.org/perl6/index.cgi?perl_6_tutorial_part_8</guid>
<pubDate>Fri, 06 Aug 2010 23:52:22 -0000</pubDate>
</item>

</channel>
</rss>