Pugs, avagy a Perl 6 megérkezett
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 A
Használhatjuk még azA kódot nem magyaráznám, talán csak a 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.
■ 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";
@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';
}
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";
}
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.
Say?
--
Ámon Tamás - http://amon.hu
Say
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 egyprintln
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-
Say 3
--
Ámon Tamás - http://amon.hu
Rend
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:
-boogie-
PHP?
én jobb' szeretem az összefűzögetést, meg azt hogy egy dolognak inkább csak egy neve van.
bbalint
beat the Perl guru ;)
$\
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 $,
.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?
5|7 ?
if ($a == 5|7)
ez tenyleg azt fogja jelenteni ami a cikkben van?