Raku | ||
İlk versiyonun tarihi | Özellikler : 2001'den beri, Rakudo Star tarafından uygulanan, 25 Aralık 2015'te açıklanan ilk kararlı sürüm | |
---|---|---|
Paradigmalar | Amaç , zorunlu , işlevsel , dinamik | |
Yazar | Larry duvarı | |
Geliştiriciler | Perl Vakfı | |
Son sürüm | Rakudo Star 6.d Diwali / Kasım 2018 | |
Yazıyor | Güçlü , dinamik ve / veya statik , kademeli | |
Tarafından etkilenmiş |
Haskell Perl Ortak Lisp Ada META II ( tr ) APL Ruby Python Smalltalk Self |
|
Etkilenen | Perl , Haskell | |
Uygulamalar | Puglar , Rakudo (başlangıçta ile papağan , şu anda şu MoarVM ve JVM ) | |
Yazılmış | Raku | |
İşletim sistemi | Çoklu platform | |
Lisans | Artistik Lisans 2.0 ( d ) | |
İnternet sitesi | https://raku.org/ | |
Dosya uzantısı | raku, rakumod, rakudoc, rakutest ve t | |
Raku (eski Perl 6 ) altıncı ana sürüm ait programlama dili Perl . Aynı zamanda, hem tasarımında hem de uygulanmasında, önceki sürümlerle bir uyumluluk modu sağlanmasına rağmen, önceki büyük sürümler için geçerli olan geriye dönük uyumluluk gereksinimini ortadan kaldırarak , dilin büyük bir revizyonudur . Raku ismi Larry Wall tarafından Perl 5 taraftarlarını tatmin etmek ve böylece Perl 6'nın Perl 5'i modası geçmiş hale getirecek önemli bir Perl versiyonu olmadığını belirtmek için "sahne adı" olarak seçildi .
Bu yeniden tasarım, programcıya büyük özgürlük bırakan ve ona özlü bir ifade veren dilin ruhunu hala koruyor. Raku genel bir dil olarak kalır ve yine de tek satırı programlamanıza izin verir , ancak aynı zamanda statik veri yazma ve nesne yönelimli programlama için daha iyi destek gibi özelliklerle önemli programların yazılmasını da sağlar .
Perl'den farklı olarak Raku, bir kıyaslama uygulamasıyla değil, Nisan 2001'de yazılmaya başlanan bir dizi test kodunun yanı sıra doğal dil spesifikasyonları ile tanımlanır. Bu spesifikasyonlar herkese açıktır ve bu nedenle tüm geliştiriciler, uygulamasını oluşturmakta özgürdür. . Dolayısıyla Raku'nun tek bir uygulaması yoktur. Tarihsel olarak, en az üç proje dili veya bir alt kümesini uygulamaya çalışmıştır. 2018'de sadece Rakudo aktif geliştirme konusudur.
Perl Vakfı sahibi olan telif üzerinde Rakudo uygulanması hedefler, JVM ve MoarVM sanal makineler . MoarVM, Rakudo için özel olarak yazılmış bir sanal makinedir . Rakudo'nun kendisi büyük ölçüde Raku'da yazılmıştır.
28 Kasım 2015'te Raku / Rakudo geliştirme ekipleri, Kasım 2015'in 2015.11 dağıtımının Raku'nun kullanılabilir ve istikrarlı bir betası olduğunu duyurdu.
Birkaç yıl boyunca Raku'nun Perl topluluğunda serbest bırakılmasıyla ilgili mizahi bir açıklama devam etti. "Perl 6 dili ne zaman kullanıma sunulacak?" "(" Perl 6 "adı isimlendirmeden önce geçerliydi), olağan cevap" Noel'de "idi, ancak yılı belirtmeden. 2015 yılında, yani on beş yıllık bir bekleyişin ardından, sözde “Noel” versiyonu nihayet açıklandı.
Raku'nun logosuna Camelia denir. Kanatlarında P harfini ve 6 rakamını okuyabildiğimiz bir kelebektir (logo Raku'da yeniden adlandırmadan öncesine aittir).
Perl dili başlangıçta çok mütevazıydı ve geriye dönük uyumluluk açısından büyüdü . 1987'de kurulan Perl, öğrenmeyi zorlaştıran ve tercümanı gereksiz yere karmaşıklaştıran çok fazla cüruf biriktirdi . Ondan kurtulmak gerekiyordu. Varsayılan dil davranışları, birkaç satırlık programlar için tasarlanmıştır. Dil, büyük programları desteklemek için evrimleşmiş olsa bile ( sözcüksel değişkenler , nesne yönelimi…), programcıların büyük bir kısmı stillerini uyarlamamıştı, bu da Perl'e kirli bir dille itibar kazandırdı.
Perl 5 yorumlayıcısı , işlemciye göre yavaş belleğe sahip çok işlemcili veya çok çekirdekli mimarilerden en iyi şekilde yararlanmamaktadır . Ek olarak, büyük ölçekli programlama için, parametreleri geçirmek için güçlü bir sisteme sahip olmak gerekir. Aynı şekilde, programcıya statik veri tipleme imkanını vermek önemliydi, ancak zorunluluğu değil. Bu tipleme, hem dokümantasyondur, derleme zamanında yürütülen bir iddia biçimi hem de dinamik tiplemeye göre bir performans iyileştirmesidir.
Dil, özellikle besteciler ve hiperoperatörler sayesinde çok kısa programlar yazmayı hala mümkün kılıyor . Bunlar, APL dilinin dinamik dizi işleme operatörlerine benzer . Program bölümlerinin yürütülmesini paralelleştirmeyi mümkün kılan somut sözdiziminin yönlerinden biridir .
Dil çok eksiksizdir ve bu nedenle oldukça karmaşıktır, ancak dilin kısıtlı bir alt kümesinde programlama yapmak yine de mümkündür. Diğer diller için genellikle yazılım kitaplıklarına ait olan birçok özellik içerir. Böylece, düzenli ifadeler sistemi tamamen elden geçirildi ve gerçek tam gramerler için bir temel oluşturacak ve aynı zamanda geri izlemenin çok ince bir kontrolü sayesinde güçlü ve hızlı bir ayrıştırma motoru oluşturacak şekilde genişletildi . Mevcut Raku derleyicisi, Raku ile yazılmış bir Raku dilbilgisine dayanmaktadır.
Raku, nesne sistemine tamamen entegre edilmiştir.
Perl 5'te minimalist olan nesne sistemi, artık CLOS'tan esinlenilmiş bir Meta Nesne Protokolü aracılığıyla çoklu gönderimi , rolleri ve yansıtmayı destekliyor .
Hem prototip odaklı programlama hem de nesne yönelimli programlama mümkündür, çünkü programcı meta sınıfların varsayılan davranışını ve gönderme mekanizmasını yöntemlere ve çoklu yöntemlere değiştirebilir. Roller, mixins'e benzer ancak sınıfa göre daha az ayrıntılı bir kod oluşturma sistemidir .
Raku tasarımcıları, Perl 5'te referans desteğinin eklenmesiyle önemli ölçüde daha ağır olan dil sözdizimine özellikle dikkat ettiler . Dil tasarımında kılavuz ilkeler şunlardır: Huffman ilkesi , okunabilirlik, genişletilebilirlik. Dilin her bir yönü, zarflar veya değiştiriciler adı verilen sözcüksel veya sözdizimsel yapılar aracılığıyla oldukça yapılandırılabilir. Bazı operatörler Unicode karakterlerdir, ancak genellikle daha ayrıntılı bir ASCII takma adı mevcuttur.
Bir değişkenin içeriğinin açık bir şekilde yazılması isteğe bağlıdır. Bu nedenle veri tipleme, açık veya çıkarım yapıldığında statiktir , aksi takdirde dinamiktir . Bu nedenle programcı , betik dillerinde tipik olan gevşek programlama ile statik olarak yazılmış bir dilin doğruluğu ve performansı arasında kademeli bir sürekliliğe sahiptir . Tipik olarak, bir program zamanla daha sıkı bir yazıma doğru gelişecektir.
Raku mevcut uygulamaları şu anda yavaş Perl 5'ten olmasına rağmen paralelizasyon için statik yazarak, desteğe ek olarak kendi uygulamaları destekleyen, çünkü, dil, sonunda, hızlı dil olmalıdır anında en derleme içinde yerli kod .
Raku tasarım süreci ile, 19 Temmuz 2000 tarihinde ilk kez açıklandı Larry Wall 4 th yıllık konferans günü OSCON soğan 2000 ( "Soğan 2000 Devlet") durumu hakkında yaptığı konuşmada. O zamanlar ana hedefler, tarihi siğillerin (tarihsel siğiller) dilinden kurtulmak ve genel iç tasarım ve API'leri temizlemekti. Her şey daha sonra şu cümleyle özetlendi: "kolay şeyler kolay kalmalı, zor şeyler daha kolay olmalı ve imkansız şeyler zor olmamalı".
Süreç, bir dizi Değişiklik İsteği veya "RFC" ( Yorumlara yönelik İnternet İsteğine benzer ) ile başladı. Bu süreç tüm katkıda bulunanlara açıktı ve dilin hiçbir yönünü değişime bağışık bırakmadı. Larry Wall'un yaklaşık 20 RFC alması beklenirken, Perl topluluğu üyeleri tarafından 361 değişiklik talebi yapıldı.
RFC işlemi tamamlandıktan sonra, Wall her talebi gözden geçirdi ve kategorize etti. Daha sonra Kıyamet adını verdiği şeyi yazmaya başladı . Asıl amaç Perl referans kitapçığının "Perl'de Programlama" başlıklı her bölümü için bir Kıyamet yazmak olsa da, her bir Kıyametin yazılmasında önceki Kıyametlerin sonraki değişiklikler tarafından kısmen geçersiz hale geldiği ortaya çıktı. . Bu nedenle, her biri bir Kıyametin içeriğiyle ilgili, ancak ortaya çıkan değişikliklere göre güncellenen bir dizi Özet yayınlandı. Bugün Raku'nun teknik özellikleri neredeyse tamamen Özetle devam ediyor.
Yıllar içinde Raku, birkaç liderlik değişikliğinden geçti. Python ve Ruby'den kavramların tanıtımı ilk başta etkiliydi, ancak Pugs yorumlayıcısını Haskell dilinde yazarken, fonksiyonel programlamanın Raku tasarım ekibi üzerindeki büyük etkisine dikkat çekilebilir. Bununla birlikte Pugs, çok sayıda kavramı doğrulamayı veya tam tersine diğerlerini iyileştirmeyi mümkün kılmıştır.
Pugs , tarihsel olarak Raku'nun ilk deneysel uygulamasıdır . Puglar Raku kodunu doğrudan çalıştırmanın yanı sıra Raku'yu JavaScript , Perl 5 veya Parrot bayt koduna derleyebilir . Öncelikle Audrey Tang tarafından yazılan, şu anda aktif olmayan Pugs artık aktif olarak geliştirilmiyor. Bununla birlikte, ana kavramları gerçek bir kısmi uygulama ile doğrulamayı ve bazılarını iyileştirmeyi mümkün kıldı.
Şu anda tek uygulama, standart bir kitaplık ve bir dizi üçüncü taraf kitaplığı içeren Rakudo Perl derleyicisini içeren Rakudo Star (veya Rakudo *) ' dur . Bu sürüm ilk olarak Parrot sanal makinesine dayanıyordu, ancak şimdi MoarVM ve JVM sanal makinelerine dayanıyor.
Rakudo, başlangıçta Parrot sanal makinesini kullanan ve nihayetinde Raku'yu kendi kendine barındırmayı amaçlayan bir uygulamadır . Esas olarak Raku'da yazıldığı için, Rakudo'nun diğer sanal makinelere nispeten daha kolay taşınması muhtemeldir. İçin taşıma Java Virtual Machine yanı olarak 2013 yılında başlayan MoarVM özel Rakudo çalıştırmak için tasarlanmış bir sanal makine. Perl topluluğu, CrankShaft of V8 tarafından sağlananlar gibi dinamik kod optimizasyonlarına sahip modern bir sanal makineyi sürdürmek için her zaman çaba sarf etmek zorunda değildir , bu nedenle diğer sanal makinelerin yerini alması muhtemeldir.
Telif hakkı Perl Vakfı'na ait olan Rakudo, büyük olasılıkla Raku'nun ilk önemli uygulaması olacak. İçin Raku bootstrap , Rakudo NQP (Değil Oldukça Perl), ayrıştırma motoru içerir Raku bir alt kümesini kullanır.
Rakudo'nun "kullanışlı ve kullanışlı" hale getirilmesi için çeşitli modüller içeren Rakudo Star adlı özel bir dağıtımı, Temmuz 2006'dan beri aylık olarak yayınlanmaktadır.
Bu, MoarVM sanal makinesini temel alan ve Ocak 2017'de 760'tan fazla modüle sahip olan bu Rakudo Star dağıtımıdır.
Raku, Perl'in önceki sürümlerle geriye dönük uyumlu olmayan ilk ana sürümüdür. Bu, Perl 5'te yazılan kodun Raku koduymuş gibi değişiklik yapmadan çalıştırmaya veya derlemeye çalışırsanız muhtemelen derlemede veya çalışma zamanında başarısız olacağı anlamına gelir (şartnamede sağlanan ve en azından kısmen mevcut uygulamalarda uygulanan uyumluluğun kullanılması dışında, bu mod özellikle Raku'daki Perl 5 modüllerinin iyi bir bölümünü kullanmaya izin verir).
Uyumsuz değişiklikler çoktur, ancak en dikkat çekici olanı, armanın değişmezliği, sözdizimsel sadeleştirmeler ve argümanların aktarılmasıdır.
Perl 5'de, desen - önce gelir değişken adı bu alfanümerik olmayan karakteri - kendi kullanım bağlamında (skalar veya dizi) bağlı olarak değişebilir:
# Perl 5 code my @array = (0, 1, 2, 3); my $element = $array[1]; # $element est égal à 1Raku, olası bağlamlar bolluğu farklı bir mekanizma gerektirir Sigils . Mühür artık erişim bağlamını belirlemez. Raku, bunu yapmak için uzman operatörler sunar. Bir değişkenin işareti bu nedenle değişmezdir. İki farklı gramer işlevi için iki sözdizimsel mekanizmaya sahip olmak daha eğiticidir (değişkenin zayıf yazımı ve erişim bağlamı).
# Code Raku my @array = 0, 1, 2, 3; my $element = @array[1]; # $element est égal à 1Perl tanımlı alt yordamların önceki sürümleri, resmi bir parametre listesi olmadan .
Bir alt yordama giren alt yordam argümanları, @_ dizisinin öğelerinde takma adlar haline geldi . Eğer @_ değiştirildi değişiklikler orijinal verilerde yansıdı:
# Code Perl 5 sub incr { $_[0]++ } my $x = 1; incr($x); # $x est maintenant 2 incr(3); # erreur lors de l'exécution : "Essai de modification d'une valeur en lecture seule"Sigilin değişmezliği hesaba katılsa bile, Perl 5'teki çoğu işlev bildirimi, Raku kodu olarak çalıştırılmak istendiğinde başarısız olacaktır, çünkü Raku, yazının ötesine geçen dildeki bir formalizm sayesinde çok farklı bir geçiş parametreleri sistemi kullanır. imzalar . Raku'da bir alt rutin bildirimi şuna benzer:
sub faire-quelquechose(Str $chose, Int $autre) { … }Perl 5'te olduğu gibi, biçimsel parametreler (örneğin, parametre listesindeki sözde değişkenler) gerçek parametrelerine (giriş değerleri) takma addır , ancak varsayılan olarak, takma adlar salt okunur olarak işaretlenir , yani salt okunurdur ve bu nedenle sabittir:
sub incr(Num $x) { $x++; # compile-time error }Resmi bir parametre tarafından takip edilirse , kopyalamaya veya rw edilir , ancak olabilir değiştirilebilir. Kopyalama durumunda Raku, mevcut ayarları takma ad vermek yerine kopyalar; bu nedenle değiştirilebilirler, ancak değişiklikler alt program için yerel olarak kalır. İs rw durumunda ( rw , okuma-yazma , İngilizce okuma-yazma anlamına gelir ), diğer ad salt okunur olarak işaretlenmez. Bu değişiklik ayrıca derleme sırasında aşağıdaki gibi hataları da algılar :
sub incr(Num $x is rw) { $x++ } incr(3); # erreur au moment de la compilation sub incr-copy(Num $x is copy) { $x++ } incr-copy(3); # Pas de problèmeParametre listelerindeki yeni Raku özellikleri, geçiş parametrelerini Perl 5'tekinden çok daha güçlü hale getirir:
Örneğin :
sub mysplit(Rule $pat? = rx/\s+/, Str $expr? = $_, Int $lim? where $^lim >= 0) { … }Raku da destekler currying .
Perl 5 ve Raku arasındaki sözdizimi değişiklikleri çok sayıda ve bazen ince. Örneğin, Raku'daki temel bir kural, iki ardışık terime sahip olmanın mutlak yasağıdır. mapŞimdi gibi bir işlevin sözdiziminin virgül görünmesinin nedeni budur . Dolayısıyla, aşağıdaki gibi bir Perl 5 kodu:
# Perl5 print $_ for map { $_**2 } 1 .. 3;Raku kodu olarak çalıştırmayı denerseniz derlemede başarısız olur. Anonim işlev ile liste arasına virgül eklemeniz gerekir:
# Raku say $_ for map { $_**2 }, 1 .. 3;Aynı nedenlerden dolayı, dolaylı nesne gösterimi (zaten topluluk tarafından kullanımdan kaldırıldı) ortadan kalktı.
Raku'nun sözdiziminin kendisi Raku'da tanımlanmıştır. Önemsiz görünebilecek bu noktanın, dilin yapısı ve sunduğu olanaklar üzerinde çok derin sonuçları vardır.
Özellikle, bu Raku'nun sözdizimsel olarak dilin metinsel analiz özelliklerinin dayattığı kurallara uyduğu anlamına gelir. Bu nedenle, sözcük analizi Raku'daki normal ifadelerin işlenmesiyle empoze edilenlerle aynı öncelikleri karşılar . Bu durumda, bu kural, basitleştirirken, en uzun sözcük birimidir (en uzun simge eşleşmesi ). Bu kural Raku'da temeldir ve dilin birçok yönü üzerinde büyük etkisi vardır. Örneğin, en uzun sözcük birimi kuralı, değişken adlarının çıkarma ile karıştırılmadan '-' karakterini içermesine izin verir .
Diğer bir sonuç, dilin yürütme sırasında kendi sözdizimini değiştirme olasılığıdır; bu, çok nadir programlama dilleri tarafından gerçekleştirilen bir performans oluşturur, en sembolik olan Lisp'dir .
Perl 5'in statik yazma sisteminin birkaç türü vardır. Bir değişkeni bildirirken, arması skalar , dizi veya karma türünde olup olmadığını belirler ( ilişkisel tablo için metonym ). Bir skaler, bir tam sayı , bir kayan nokta , bir dize vb. İçerebilir . Kabın türü, içeriğin türünü yalnızca kısmen belirlediğinden, yarı dinamik yazımdan bahsediyoruz.
Raku'da Perl 5'in işaretleri ve dinamik tiplemesi , statik tiplerin eklenmesiyle genişletildi . Bu, konteynerin türünün açık beyanından oluşur. Örneğin :
my Int $i = 0; my Num $n = 3.141e0; # le suffixe -e0 est nécessaire ici pour créer un littéral flottant. my Str $s = "Hello, world";Bununla birlikte, tıpkı Perl 5'te olduğu gibi, programcılar açık yazmadan da yapabilirler:
my $i = "25" + 10;Statik yazım, kaynak kodda yerleşik bir belge ve test biçimidir. Özellikle büyük yazılım projelerinde bakımı iyileştirir. Ancak statik yazım, kısa komut dosyalarının kodunu veya bir satırlık kodu daha kullanışsız hale getirir . Açık bir non-sigil tür bildirimi içermeyen bu kısa stil, tek seferlik kod yazmak için kullanıldığında Perl'in bir gücüdür.
Raku ayrıca dallar adı verilen ikincil işaretleri de sunar .
Perl 5 , Perl'e özgü kutsama adı verilen bir mekanizma aracılığıyla nesne yönelimini destekledi . Herhangi bir referans belirli bir sınıfın nesnesi olarak kutsanabilir , örneğin:
# Perl 5 code my $object = bless $reference, 'Class';Kutsanmış bir nesnenin "ok sözdizimi" kullanılarak çalıştırılan yöntemleri olabilir :
# Perl 5 code $objet->méthode();Çağrı, uygun alt rutini ada göre tanımlar méthodeve onu $objetilk argümanla çağırır .
Çok güçlü olmasına rağmen (başka bir dilin hemen hemen her başka nesne modeli bu basit işlevsellik kullanılarak simüle edilebilir), kodla ilişkili bir C yapısı gibi en yaygın nesne yönelimi durumunu gereksiz yere zorlaştırdı. Ayrıca, Perl kullanılan nesne modeli hakkında herhangi bir varsayımda bulunamadığından, yöntem çağrısı çok iyi optimize edilemedi.
Raku, basit şeyleri daha basit ve karmaşık şeyleri daha kolay hale getirme ruhuyla, ortak işlevsellik isteyen programcılar için bir örnek oluşturmayı kutsama ilkesini sürdürüyor. Bu, yaygın durumlar için daha sağlam bir nesne modeli sağlar. Örneğin, bir Kartezyen noktasını çevreleyen bir sınıf şu şekilde yazılabilir:
class Point is rw { has ($.x, $.y); method gist { "Point a x=$.x y=$.y" } }ve kullanılmış:
say my Point $point .= new: :x(1.2), :y(-3.7); $point.x = 1.1; say $point;Nokta, bir örneğin üyesine erişim operatörü olarak okun (Perl 5'e özel) yerini alır. C ++ , Java , Python ve Ruby dahil birçok dile özgü sözdizimidir .
" x " Ve " y " yöntemlerinin açıkça bildirilmediğine dikkat edin. Bunlara otomatik erişimciler denir. is rw Sınıf tanımındaki " " değiştiricisi , tüm genel özniteliklerinin otomatik erişimciler kullanılarak varsayılan olarak yazılmasına izin verir . [1]
Bir örneğin veri üyelerine "öznitelikler" denir. Aşağıdaki şekilde beyan edilebilirler:
has $.a; # mode d'accès par défaut (généralement en lecture seule) has $.b is rw; # accès en lecture et en écriture has $!c; # membre privé; pas d'accesseur public has $d; # comme $!dAynı sözcük alanında, aynı ada sahip birkaç rutin veya yöntem, bunların önüne multi anahtar kelimesi eklenerek tanımlanabilir . Aynı adı taşıyan tüm rutinleri veya yöntemleri belirtmek için multi'den bahsedeceğiz. Bir multi çağrılırken, imzası aktarılan argümanlara karşılık gelen rutin veya yöntem çağrılacaktır. Çağrının argümanları ile aranan tarafın parametreleri arasındaki bağlantı sistemi çok karmaşıktır.
Bu nedenle, bir n-ary ağacını geçmek için, beklenen bağımsız değişken, çocukları $ eldest ile başlayan ve muhtemelen @ brothers ile başlayan bir dizi olan Nary türünde bir düğüm veya bir $ yaprağıdır.
multi traverser ( NAry $noeud ( :enfants [$ainé, *@frères] ) ) { traverser($ainé); traverser(:enfants(@frères)); # (lie @frères à $sommet) } multi traverser ( $feuille) {…}Bu çok yöntemli sistem, bu nedenle, işlevsel programlamaya özgü model filtreleme işlevini içerir.
Düzenli ifade ya da düzenli ifadeler (İngilizce, regex için düzenli ifade ) Perl dedikleri bir kütüphane tarafından uygulamaya konulmuştur ki çok başarı deneyimli PCRE (Perl Uyumlu Normal İfadeler). PCRE aracılığıyla, diğer birçok dilde normal ifadeler geliştirme olmadan dahil edilmiştir. Yine de, Larry Wall'un da işaret ettiği gibi, Perl'e okunamayan bir dil olarak ün kazandıran şey düzenli ifadelerdi. Çok kompakt ve çok kötü huyludurlar, aynı karakterler çeşitli kullanımlar için kullanılır. Adlandırılmış yakalamalar için çok az destek, gramerler için çok az destek ve gerçek dillerle zayıf entegrasyon var.
Raku, normal ifadeler için Perl 5 işlevselliğinin bir üst kümesi sağlar. Normal ifade mekanizması, ayrıştırıcılarla karşılaştırılabilir güç sağlar. Bu normal ifadeler , kendi sözcük alanlarını kapatır. Regex anahtar kelimeler ile tanıtıldı rule, regex, token. Bir normal ifadenin tanımı, bir alt yordamın tanımına benzer ve parametreler alabilir. Anahtar kelimenin seçimi, normal ifadede boşlukların önemli olup olmadığını kontrol etmeye ve geri izleme olup olmayacağını belirtmeye izin verir. Perl 5'te olduğu gibi, anonim regex'leri de tanımlayabilir veya bunları doğrudan operatörlerde m(eşleşen) veya s(ara ve değiştir) kullanabilirsiniz.
Perl 5 normal ifadelerinden bu yana yalnızca altı özellik değiştirilmedi:
En etkili eklemelerden bazıları şunlardır:
Aşağıdaki değişiklikler, normal ifadelerin okunabilirliğini büyük ölçüde artırmıştır:
Örnekler:
rx { a [ b | c ] ( d | e ) f : g } rx { ?( ab* ) <{ $1.size % 2 == 0 }> }Son satır şununla aynıdır:
rx { ( ab[bb]* ) }Yeni programcılar genellikle aşağıdaki tek satırda olduğu gibi zincirleme karşılaştırmaların çalışmasını beklerler :
if 1 <= $dé1 == $dé2 <= 6 { say "Doubles!" }Raku'da bu kod artık DWIM ( Demek İstediğimi Yap) ruhuna uygun olarak doğal bir şekilde çalışıyor ve şu şekilde çalışıyor:
if 1 <= $dé1 and $dé1 == $dé2 and $dé2 <= 6 { say "Doubles!" }Raku, Haskell gibi bazı işlevsel programlama dillerinin bir özelliği olan tembel liste değerlendirmesi sunar . Tembel değerlendirme, Raku'daki G / Ç işlemleri, listeleri dönüştürme ve bağımsız değişkenleri bir rutine geçirme gibi yaygın görevleri basitleştirir:
my @integers = 0 .. *; # entiers de 0 à l'infiniYukarıdaki kod olacak değil çökmesine tabloya sonsuz boyut listesini atamak çalışırken @integers.
Meta operatörler, farklı davranışa sahip bir operatör elde etmek için başka bir operatöre etki eden operatörlerdir.
Atama operatörleriPerl5, C dilinden " += ", " *= " vb. Bazı ikonik operatörleri miras almıştı . Raku, bu kavramı " = " atama meta operatörü ile genelleştirir .
Böylece, herhangi bir ikili operatör "op" için şunu yazabiliriz:
$x op= $y; # ou encore $x [op]= $yİçin :
$x = $x op $y;" op " Kullanıcı tanımlı bir operatör olabilir.
hiper operatörlerHiper operatörler dinamik diziler işleme dili operatörleri benzer APL veya operatör harita Bunlar bir operatör hareket Perl 5. ve bir dizinin tüm değerleri faaliyet göstermektedir. Öyleyse, tüm öğelerinin 1 eklediğimiz bir @a dizisinin öğeleri olduğu bir dizi oluşturmak için şunu yazın:
my @a-plus-un = @A »+» 1; # aussi noté @A >>+>> 1 Redüksiyon operatörüİndirgeme meta operatörü herhangi bir ilişkili infix operatörü üzerinde çalışabilir ve bunu bir liste operatörüne dönüştürebilir. Sanki meta operatör, ilk kısmi sonucu elde etmek için listenin ilk iki öğesine orijinal operatörü uygulamış, sonra aynı operatörü elde edilen kısmi sonuca ve yeni bir kısmi elde etmek için listenin sonraki öğesine uygulamış gibidir. sonuç, vb. listenin sonuna kadar devam eder. Bu, listeyi tek bir değere "indirgemeyi" mümkün kılar ve duruma, toplam, ürün, ortalama, maksimum eleman, minimum eleman, standart sapma vb. Olabilir. listedeki öğeler. Örneğin, aşağıdaki örnekte olduğu gibi, + işlecini bir listenin öğelerinin toplam işlevi sıralamasına yükselten son derece güçlü bir yapıdır:
say "La somme des cent premiers entiers naturels est: ", [+] ^100; Kartezyen ürün operatörüBu operatör, iki veya daha fazla liste arasında bir Kartezyen ürünü döndürür; yani, birinci öğenin birinci listenin bir öğesi, ikinci öğenin ikinci listenin bir öğesi olduğu tüm olası tupleların bir listesi ve benzeri:
say my @chessboard = 'a'..'h' X~ 1 .. 8; Zip operatörüZip operatörü (Z), iki veya daha fazla listeyi, her listenin öğelerini serpiştirerek birleştirir, yani her giriş listesinin ilk öğesini, ardından her listenin ikinci öğesini içeren bir liste döndürür ve bu böyle devam eder.
say my @diagonal = 'a' .. 'h' Z~ 1 .. 8; Ters operatörBu operatör, orijinal operatörün argümanlarının ters çevrilmesine izin verir.
say "un tiers est égal à ", 3 R/ 1; Meta operatörleri yerleştirmeMeta operatörler, [] belirsizliği gidermek için köşeli parantezler (" ") kullanılması anlamına gelse bile iç içe yerleştirilebilir .
@a >>>>> $b # Comment? @a >>[>]>> $b # ah, oui.Raku, kavşak kavramını tanıtıyor . İlişkisel veritabanlarına özgü bir kavram olan birleşimlerden ayırt etmek için bu terimi seçiyoruz . Kavşaklar, bileşik skaler değerlerdir. Kavşaklar başlangıçta kavramına kıyas yoluyla, bindirmeleri çağrıldı kuantum fiziği arasında bindirmeleri kendi gözlem kadar birkaç durumlarını aynı anda doldurabilir eğrileri - kuantum çökmeler . Yapılan bir Perl 5 modülü 2000 tarafından Damian Conway denilen kavramın ilk kanıtlamaktadır. Önce programa dayalı bir merak, sonra kavşaklar önemli bir Raku kavramı haline geldi. Quantum::Superpositions
En basit haliyle, kavşaklar, bir dizi değerin kavşak operatörlerinden biriyle birleştirilmesiyle oluşturulur :
my $even_digit = 0|2|4|6|8; # any(0, 2, 4, 6, 8) my $odd_digits = 1&3&5&7&9; # all(1, 3, 5, 7, 9) my $not_zero = none(0);Bu değerler aritmetik olarak kullanılabilir:
my $jonction = 1|2|3; $jonction += 4; # jonction maintenant égale à 5|6|7 $jonction += (1&2); # jonction maintenant égale(6|7|8)&(7|8|9)veya karşılaştırmalarda:
if $grade eq any('A'..'D') { say "pass" }hatta bir tabloya erişim için:
if %person{any('first_name', 'nickname')} eq "Joe" { say "What do you know, Joe?" }Tip sistemini genişletmek için kavşaklar da kullanılabilir:
class RGB_Color is Tuple[int, 3] & Color { … } sub get_tint (RGB_Color|CMYK_Color $color, num $opacity where 0 <= $^opacity <= 1) { … } sub store_record (Record&Storable $rec) { … }Kavşaklar sıralı değildir; 1|2|3ve 3|2|1aynı değerleri temsil eder. Bu düzen eksikliği, Raku derleyicisinin kavşaklardaki ifadeleri paralel olarak değerlendirmeyi seçebileceği anlamına gelir . Aslında, Raku topluluğundaki pek çok kişi, kavşakların Raku'da paralelliği başarmanın sıradan yolu olarak açık çoklu okumayı geçersiz kılabileceğine inanıyor .
Pek çok modern dil gibi Raku, paralelliğe, yani aynı anda birden fazla görevi yerine getirmeye ve eşzamansız programlamaya (bazen olay programlama olarak adlandırılır), yani bir programın bir bölümündeki bir olayın veya bir değişikliğin diğerine yol açabileceği şekilde tasarlandı. bir programın normal yürütme akışına göre zaman uyumsuz olarak bir programın başka bir bölümünde meydana gelen olay veya değişiklik.
Raku, sanal bir makinenin belirli bir işletim sistemi için bu arabirimi nasıl uygulayabileceğinden bağımsız olarak modüler ve tutarlı bir üst düzey paralellik arabirimi sağlar. Ek olarak, Perl'in bazı özellikleri örtülü olarak eşzamansız olarak çalışabilir. Bu işlevselliklerin kontrollü ve öngörülebilir birlikte çalışmasına izin vermek için, kullanıcı kodu mümkün olduğunca yüksek seviyeli arayüzler kullanır ve düşük seviyeli arayüzlerin (iş parçacıkları, programlayıcılar, kilitler vb.) Kullanılmasını önler. Kenara farklı işletim sistemleri veya çalışma zamanı ortamlarda aynı çalışmıyor olmasından, bu düşük seviyeli mekanizmaları koydu programlama dillerinin çoğunda herkesin bildiği program ve usta çok zor bulunmaktadır. Uygulanan (ve Perl 5 ipler istisna değildir).
Bu üst düzey mekanizmaların merkezi varlığı, söz verildiğinde tamamlanamayabilecek bir hesaplamanın sonucunu temsil eden vaattir. Sözler, kullanıcı kodunun paralel veya eşzamansız olarak çalışması için ihtiyaç duyduğu çoğu şeyi sağlar. Bir program sözünü tutabilir (sonucu verebilir) veya bozabilir (bu sonucu veremeyebilir). Bir sözün üç durumu olabilir: planlanmış (henüz gerekli değil), tutulmuş veya bozulmuş. Vaatlerin gücünün çoğu, onları birleştirmenin veya zincirlemenin mümkün olmasından kaynaklanmaktadır:
my $promesse1 = Promise.new(); my $promesse2 = $promesse1.then( { say "Résultat de la seconde promesse"});Burada, then2. sözün kodunu, 1. söz tutulduğunda (veya ihlal edildiğinde) yürütülmesi için sipariş edin.
Ayrıca, diğer programlama dillerindeki olaylara benzer bir şekilde bir veya daha fazla tüketici tarafından eşzamanlı olarak tüketilebilen bir asenkron veri akışı mekanizması sunan sağlayıcılar ( Tedarik ) da vardır . Olay programlama şemalarını ayarlamak için kullanılabilir.
Son olarak, bir kanal ( Kanal ) bir kuyruktur veya kuyruk, süreçler arası iletişime izin veren FIFO'ya (ilk giren ilk çıkar) benzer şekilde birden çok okuyucuya ve birden çok yazara sahip olabilir.
Düşük seviyeli dillerde, makrolar kavramı , dilin sözdizimini göz ardı eden bir ön işlemcinin geniş kullanımı nedeniyle kaynak kodun metinsel ikameleriyle eşanlamlıdır . C dili yapımını kullanır #define. Perl 5 bu amaçla kaynak filtre sistemlerini kullanır . İstiflemelerinin rastgele etkileri olduğu için herkesin bildiği gibi güvenilmezler. Bunun nedeni, her filtrenin, selefleri tarafından değiştirilen kodu alırken filtrelediği kodun Perl 5 kodu olduğunu varsaymasıdır.
Lisp ayrıcalıklıdır, çünkü programın kaynak koduna karşılık gelen sözdizimi ağacını doğrudan işleyen bir makrolar sistemi sunar. Bu kolaydır, çünkü somut sözdizimi soyut sözdizimiyle aynıdır. Nihayetinde Raku, dilin en iddialı hedeflerinden biri olan Lisp'teki kadar güçlü bir makro sistemi entegre etmeyi hedefliyor.
Raku her iki tür makro da sunacak: metin ikameleri ve AST manipülasyonu .
Bir Raku makro tanımı, bir alt yordam veya yöntem tanımı gibi görünür ve ayrıştırılmamış dizeler üzerinde, önceden ayrıştırılmış kodu temsil eden bir AST soyut sözdizimi ağacı veya ikisinin bir kombinasyonu üzerinde çalışabilir . Bir makro tanımı şöyle görünebilir:
Bu özel örnekte, makro C'deki bir metin ikamesinden daha karmaşık değildir, ancak makro parametresinin ayrıştırılması, makro çağrılan kod üzerinde çalışmadan önce gerçekleştiğinden, teşhis mesajları çok daha bilgilendirici olacaktır. Ancak, program her başlatıldığında makronun gövdesi derlendiği için çeşitli optimizasyon teknikleri kullanılabilir.
Raku'da Perl 5'te olduğu gibi yazabiliriz
print "Hello world\n";Raku'da merhaba dünyayı şu şekilde yazmayı tercih ediyoruz :
say "Hello world";saybenzer saybir REXX için, writelnbir Pascal ve putsbir Ruby ve C .
Perl 5'te olduğu gibi, JAPH'ler ("Just another Perl hacker" yazan programlar) Raku ile deneyler yapmanın iyi yollarıdır.
İşte bir köri örneği :
sub japh (Str $lang) { say "just another $lang hacker"; } my &perl6Japh := &japh.assuming("Perl6"); perl6Japh();