ugrás a tartalomhoz

Pugs, avagy a Perl 6 megérkezett

Bártházi András · 2005. Már. 21. (H), 23.23
A Perl 6 és Parrot párost, azaz a Perl nyelv következő generációját és az azt futtató virtuális gépet - nem csak Perles körökben - már sokan várják. A Perl egy egységesített, sok tekintetben kiegészített, ha lehet még rugalmasabb, teljesen újragondolt verzióját jelenti a hatos verzió, a Parrot pedig nem csak a Perlre fog szorítkozni, hanem más nyelvek futtatására (akár PHP-re) is képes lesz, ezáltal a nyelvek együttműködését is megvalósítva. Mindkét rendszer fejlesztése lassan, de biztosan zajlik, azonban szép csendben, szinte a semmiből időközben elkészült egy Perl 6 futtató, mely alig pár hetes, de kiválóan beszéli a nyelvet. Ez a Pugs.

A Pugs jelenleg nem egy virtuális gépet használ a futtatáshoz, hanem maga futtatja a kódot, hasonlóan a Perl 5 implementációjához, de a tervek szerint rövidesen a Parrotra is képes lesz fordítani. Haskellben van írva, ami egy (talán nem csak nekem) fura, de nagyon modern funkcionális nyelv. A Pugs egy játéknak indult, de egy komoly rendszer lett belőle, mely napról-napra fejlődik, s egyre közelebb kerül a Perl 6 specifikációjához. A célja nem csak a nyelv megvalósítása, hanem az eddig elméleti specifikáció gyakorlatban történő megvalósítása, az esetleges hiányosságok, ellentmondások feltárása. A fejlesztése tesztekre épít, vagyis először elkészül rengeteg teszt, majd ehhez elkészül a futtató.

A Pugs letöltése és lefordítása nem nagy feladat (a Haskellt telepítenünk kell hozzá a gépünkre), utána egyből rendelkezésünkre fog állni a környezet. Hogy mit tud? Nehéz lenne felsorolni a Perl 6 újdonságait és lehetőségeit, de álljon itt egy (nagyon) kis (és felületes) ízelítő az összekapcsolók (junctions) bemutatásával, melyet már ma használhatunk.

Az összekapcsoló egy olyan művelet, mely gyakorlatilag egy halmazt, és az elemek közötti kapcsolatot jelölő értéket hoz létre. A következő példa, mely egy Pugs teszt, az any összekapcsoló használatát mutatja be:

my @color = qw(red green blue);
my $x = any @color;
my $y = 'blue';
my $result = ($x eq $y) ?? "acceptable" :: 'unacceptable' ;
print "$result color\n";
A @color egy három elemű tömb lesz, melynek értékei red, green és blue. A $x skalár változó értéke a @color tömb valamely eleme lesz, vagyis összehasonlítva a $y értékével, mely blue, akkor ezt a következőképpen olvashatjuk: "Ha bármely @color elem egyezik blue-val, akkor...". A ?? és :: a feltételes operátort jelentik (a Perlhez, PHPhez képest dupla karakter jelöli ezeket).

Használhatjuk még az all, one és not függvényszerű megfogalmazását is az összekapcsolóknak, illetve létezik operátor verziójuk is. A függvényszerű esetben egy elég jól olvasható kódot kapunk:

my @x = qw(1 2 3);
my @y = qw(3 4 5);

if ( any(@x) == any(@y) ) {
  say 'van egyező elem';
}

if ( all(@x) <= 10 ) {
  say 'az összes @x elem kisebb mint 10';
}
A kódot nem magyaráznám, talán csak a say-t, ami nem más, mint a print egy extra soremeléssel kiegészítve. Az operátorok is hasonlóan "jól" néznek ki:

my $a = 5;
if ($a == 5|7) {
  say "5 vagy 7";
 } else {
  say "nem talált";
}
Talán ezen sincs mit magyarázni, a feltétel olvasata: "Ha a $a változó értéke 5 vagy 7, akkor...".

Meg kell említeni, hogy a Pugs nem valósít meg még mindent, amit a Perl 6 specifikációja meghatároz, de ha megnézzük szerzőjének blogját, láthatjuk, hogy minden nap újdonságot hoz.

A témáról bővebben a http://pugscode.org, a http://dev.perl.org/perl6/ és http://www.parrotcode.org/ oldalakon olvashatunk többet. A Perl.com nemrégiben készített egy interjút a szerzővel, mely szintén érdekes olvasmány.
 
1

Say?

sajt · 2005. Már. 22. (K), 14.09
Hogy mit ki nem talalnak meg a println-re...
--
Ámon Tamás - http://amon.hu
2

Say

Bártházi András · 2005. Már. 22. (K), 20.50
Nem tudom, miért emellett döntöttek, de a say alapból tesz csak soremelést a kiírt dolgok iránt, beállítható, hogy mi legyen, amit odatesz. Ezek alapján elég hülyén jönne ki egy println név, amikor átállítod, s nem is soremelést tesz ki. Emelett van egy irányelv a Perl tervezése kapcsán, hogy minél gyakrabban használt egy parancs, annál rövidebb nevet választanak neki. :D

-boogie-
3

Say 3

sajt · 2005. Már. 23. (Sze), 02.59
Mondjuk ezt a plussy parametert ugy is lehet, hogy (php-ban:)

<?php
echo "valami\n";
?>
Bar igaz, hogy sokkal tobb karakter volt... Mondjuk az az if-es szerkezet vaggyal, az tetszik.

--
Ámon Tamás - http://amon.hu
4

Rend

Bártházi András · 2005. Már. 23. (Sze), 08.40
Amit át kell állítani, az nem egy plusz paraméter, hanem egy - fejből meg nem mondom milyen - globális változó. De lehet, hogy nincs igazam.

Egyébként nekem a rend miatt tetszik a megoldás. Egyrészt rövidebb, átláthatóbb lesz a program, másrészt nem tudom ki hogy van vele, de engem néha zavart, hogy jelenleg mind Perl, mind PHP esetében ha egy változót ki akarok iratni soremeléssel, akkor két lehetőségem van:

print "$valtozo\n";
illetve:

print $valtozo."\n";
Én - bár sokszor nyilván egyáltalán nem számít - én túl drágának tartom az idézőjelet és annak feloldását, illetve a konkatenációt, hogy erre használjam (van még a vesszővel elválasztott megoldás, ami jó lenne, de az nekem sokszor nem szokott menni valamiért). Persze ezek apróságok és egyéni preferenciák (plusz még elfogult Perl 6 rajongó is vagyok), szóval tökmindegy. ;)

-boogie-
5

PHP?

bbalint · 2005. Már. 23. (Sze), 10.31
PHP-ban az echo "függvénynek" van olyanja, hogy vesszővel adod meg a kírni kívánt dolgokat ...

én jobb' szeretem az összefűzögetést, meg azt hogy egy dolognak inkább csak egy neve van.

bbalint
6

beat the Perl guru ;)

gerzson · 2005. Már. 23. (Sze), 15.15
$\ másnéven $OUTPUT_RECORD_SEPARATOR, $ORS. Ehhez hasonlóan a print "argumentumai" közé is be lehet csempészni automatikusan elválasztó jeleket: $OUTPUT_FIELD_SEPARATOR, $OFS $,.
#!/usr/bin/perl -w
$, = ',';
$\ = "\n";
print "alma", "barack", "citrom";
Ha az ember ismeri valamennyire az awk-ot, akkor tudja mit kell keresni ;)
Ettől függetlenül osztom Boogie rigolyáit. Miért kell ilyen apróságokra figyelni, és ilyenekkel vesződni mindig egy ilyen magas szintű nyelvben?
7

5|7 ?

Anonymous · 2005. Ápr. 24. (V), 15.58
if ($a == 5|7)

ez tenyleg azt fogja jelenteni ami a cikkben van?