Perl 6 FAQ

2016-10-20 號(hào)更新。

源文件可以在 githubperl6.org上找到.

General

Rakudo 和 Perl 6 的區(qū)別是什么?

Rakudo 是 Perl 6 的一個(gè)實(shí)現(xiàn)。目前它是完成度最好的但是過(guò)去也有其它的實(shí)現(xiàn), 將來(lái)也可能會(huì)有其它實(shí)現(xiàn)。Perl 6 是語(yǔ)言的定義。很多場(chǎng)合

這兩個(gè)名字可以寬松地使用并互相替換。

會(huì)有 Perl 6 版本 6.0.0 嗎?

第一個(gè)穩(wěn)定語(yǔ)言版本的版本稱為 v6.c,而不是 6.0.0。 不同的命名方案使得不太可能發(fā)布具有精確版本 6.0.0 的語(yǔ)言。

您可以使用下面的代碼檢查您的 Rakudo 編譯器是當(dāng)前至少是什么版本(注意這可能不是真正的供應(yīng)商二進(jìn)制文件):

perl6 -e 'say q[too old] if $*PERL.version before Version.new(q[6.c])'

它首先由 Rakudo Perl 6 編譯器版本的 2015.12 實(shí)現(xiàn),并且可能通過(guò)使用 'use 6.c' 指令在可預(yù)見(jiàn)的未來(lái)支持后續(xù)版本。 下一個(gè)語(yǔ)言版本(無(wú)發(fā)布日期)為 v6.d.

作為一個(gè) Perl 6 初學(xué)者我應(yīng)該安裝什么?

如果你是一個(gè) Linux 或 Mac 用戶, 你可能需要下載 Rakudo Star 并通過(guò)編譯 MoarVM 版本安裝(一個(gè)簡(jiǎn)單的處理)

如果你是一個(gè) Windows 32 或 64 位用戶, 那么 Rakudo Star 二進(jìn)制版本在 rakudo 網(wǎng)站也能獲得。你需要 Windows Git 來(lái)使用 panda。

Linux 和 Mac 二進(jìn)制版本稍后也可能從供應(yīng)商和第三方那兒獲取到。盡管供應(yīng)商版本可能過(guò)時(shí)了。

或者有一個(gè)官方的 rakudo star Docker 鏡像, 地址為 https://hub.docker.com/_/rakudo-star/

作為一個(gè)中高級(jí)用戶我想跟進(jìn) Rakudo 開(kāi)發(fā)

安裝類似于 Perl 5 的 perlbrew -- rakudobrew , 同等的 Python 還有 Ruby 工具。

從哪里能找到關(guān)于 Perl 6 的好文檔?

最令人信賴的信息能在 perl6.org 或那兒的直接鏈接。

你也可以使用 Google 搜索 Freenode #perl6 IRC 頻道。

http://www.perl6.org/documentation/http://doc.perl6.org/

什么是 Perl 6 spec?

"spec" 指的是 Perl 6的官方測(cè)試套件。它被稱作 roast 并被托管在 github 上.

它被用來(lái)測(cè)量一個(gè) Perl 6 的實(shí)現(xiàn)有多徹底。

有沒(méi)有 Perl 6 的術(shù)語(yǔ)相關(guān)的項(xiàng)目?

查看 glossary

我是一個(gè) Perl 5 程序員. Perl 5 和 Perl 6 的區(qū)別在哪兒?

https://docs.perl6.org/language/5to6-nutshell 下面查看 ‘5to6-nutshell’ pod 文檔和相關(guān)頁(yè)面。

模塊

Perl 6 有 CPAN 嗎? 或者 Perl 6 會(huì)使用 Perl 5 的 CPAN 嗎?

Perl 6 還沒(méi)有像 CPAN 那樣成熟的模塊倉(cāng)庫(kù). 但是 modules.perl6.org 有很多已知的 Perl 6 模塊, panda 能在 Rakudo 上安裝這些模塊.

我能在 Perl 6 中使用 Perl 5的模塊嗎?

使用 Inline::Perl5 能讓大部分 Perl 5 模塊工作, 它甚至能很好地運(yùn)行 Perl 5 的 Catalyst 和 DBI。

我能在 Perl 6 中使用 C 和 C++ 嗎?

Nativecall 讓這個(gè)特別容易。

Nativecall 找不到 libfoo.so 并且我只有 libfoo.so.1.2!

這在 Debian 那樣的系統(tǒng)中很常見(jiàn)。 你需要安裝 "libfoo-dev" 來(lái)為丟失的文件設(shè)置符號(hào)鏈接。

所有的傳統(tǒng) Unix 庫(kù)函數(shù)去哪兒了?

使用 Nativecall 訪問(wèn)它們很容易。
POSIX 模塊也可以。

Rakudo 有核心標(biāo)準(zhǔn)庫(kù)嗎?

Rakudo 是一個(gè)包含最小電量的編譯器發(fā)布(Test 和 Nativecall等等),像 linux 內(nèi)核一樣。

Rakudo Star 是一個(gè)帶有一些有用模塊的 rakudo, 并且更多的模塊可以從生態(tài)系統(tǒng)里安裝。

有像 B::Deparse 那樣的東西嗎?/我怎么抓住 AST?

使用 perl6 --target=ast -e 'very-short-example()' 來(lái)抓取編譯單元的抽象語(yǔ)法樹(shù)(AST)。

語(yǔ)言特性

我怎么 dump Perl 6 的數(shù)據(jù)結(jié)構(gòu)(就像 Perl 5 的 Data::Dumper 和類似的)?

examples:


my $foo="bar"
dd $foo        # Str $foo = "bar"
say :$foo.perl # :foo("bar")
say :$foo.gist # foo => bar

生態(tài)系統(tǒng)中還有模塊來(lái)做這個(gè)事情, 例如 Data::Dump 使用顏色來(lái) Dump。

我怎么在 Perl 6 提示符(REPL)中找到歷史命令行?

從生態(tài)系統(tǒng)中安裝 Linenoise.

作為一種選擇, 在 UNIX 那樣的系統(tǒng)中可以安裝 rlwrap。這在類 Debian 系統(tǒng)中可以通過(guò)apt-get install rlwrap 安裝。

為什么 Rakudo 編譯器有時(shí)候報(bào)錯(cuò)更友好?

如果在輸出中出現(xiàn) SORRY! , 則錯(cuò)誤是編譯時(shí)錯(cuò)誤, 否則是運(yùn)行時(shí)錯(cuò)誤。

Examples:


say 1/0     # Attempt to divide 1 by zero using div

sub foo ( Int $a, Int $b ) {...}
foo(1)      # ===SORRY!=== Error while compiling ...

什么是 (Any)?

Any 是一個(gè)用于新類的默認(rèn)超類(superclass)的頂層類。
它經(jīng)常在這樣的上下文出現(xiàn):變量被定義但沒(méi)有被賦值, 這里它類似于其它語(yǔ)言中的 undef 或 null 值。

examples:

my $foo;
say $foo;       # (Any) 注意圓括號(hào)表明的類型對(duì)象
say $foo.^name  # Any

(Any) 不應(yīng)該被用于檢查 definedness。 在 Perl 6 中, definedness 可能是一個(gè)對(duì)象的屬性。 通常實(shí)例是被定義的, 而類型對(duì)象是未定義的。

say 1.defined       # True
say (Any).defined   # False

so 是什么?

so 是一個(gè)松散優(yōu)先級(jí)的操作符, 它強(qiáng)制上下文為 Bool.

so 擁有和 ? 前綴操作符同樣的語(yǔ)義, 就像 and&& 的低優(yōu)先級(jí)版本一樣.

用法示例:

say so 1|2 == 2;    # Bool::True

在這個(gè)例子中, 比較的結(jié)果(結(jié)果是 Junction)在打印之前被轉(zhuǎn)換為 Bool 值了.

簽名中的那些 :D 和 :U 是什么東東?

在 Perl 6 中, 類和其它類型是對(duì)象, 并且傳遞自身類型的類型檢測(cè)。
例如如果你聲明一個(gè)變量

my Int $x = 42;

那么, 你不僅可以給它賦值整數(shù)(即, Int 類的實(shí)例), 還能給它賦值 Int 類型對(duì)象自身:

$x = Int

如果你想排除類型對(duì)象, 你可以追加一個(gè) :D 類型微笑符, 它代表"定義"(definite):

my Int:D $x = 42;
$x = Int;  # dies with:
           # Type check failed in assignment to $x;
           # expected Int:D but got Int

同樣地, :U 約束為未定義的值, 即類型對(duì)象。
要顯式地允許類型對(duì)象或?qū)嵗? 你可以使用 :_。

簽名中的 --> 是什么東東?

--> 是一個(gè)返回值約束, 要么是類型要么是有定義的值。

類型約束的例子:

sub divide-to-int( Int $a, Int $b --> Int ) {
        return ($a / $b).narrow;
}

divide-to-int(3, 2)
# Type check failed for return value; expected Int but got Rat

有明確返回值的例子:

sub discard-random-number( --> 42 ) { rand }
say discard-random-number
# 42

在這種情況下,最終值被拋棄,因?yàn)橐呀?jīng)指定了返回值。

Any 和 Mu 的區(qū)別是什么?

Mu 是所派生出的所有其它類型的基類型. Any 是從 Mu派生來(lái)的, 代表著任何類型的 Perl 6 值. 主要區(qū)別是, Any 不包含 Junction.

子例程參數(shù)的默認(rèn)類型是 Any, 以至于當(dāng)你聲明 sub foo ($a) 時(shí), 你真正表達(dá)的是 sub foo (Any $a) . 類似地, 類的聲明被假定繼承自 Any, 除非使用了像 is Mu 這樣的 trait 特征.

怎么從 Junction 中提取值?

如果你想從 Junction 中提取值(特征態(tài)), 那你可能正誤入歧途. 應(yīng)該使用 Set 代替

Junctions 作為匹配器, 而不是使用它們做代數(shù).

如果你還是想那樣做, 你可以濫用自動(dòng)線程(autothreading):

sub eigenstates(Mu $j) {
    my @states;
    -> Any $s { @states.push: $s }.($j);
    @states;
}

say eigenstates(1|2|3).join(', ');
# prints 1, 2, 3 or a permutation thereof

如果 Str 是不可變的, 那么 s/// 是怎么工作的? 如果 Int 是不可變的, $i++ 是怎么工作的?

在 Perl 6 中, 很多基本類型是不可變的, 但是保存它們的變量不是. s/// 作用于變量上, 在這個(gè)變量中放入一個(gè)新創(chuàng)建的字符串對(duì)象. 同樣地, $i++ 作用于 $i 變量上, 而不是作用在它里面的值身上.

更多詳情請(qǐng)查看: containers 文檔。

什么是數(shù)組引用和自動(dòng)解引用? 我仍然需要 @ 符號(hào)嗎?

在 Perl 6 中, 幾乎所有的東西都是引用. 所以談?wù)?taking references 沒(méi)有多大意義. 不像 Perl 5 那樣, Perl 6 的標(biāo)量變量也能直接包含數(shù)組:

my @a = 1, 2, 3;
say @a;                 # "1 2 3\n"
say @a.WHAT;            # (Array)

my $scalar = @a;
say $scalar;            # "1 2 3\n"
say $scalar.WHAT;       # (Array)

最大的區(qū)別是, 標(biāo)量中的數(shù)組在列表上下文中是一個(gè)值, 然而數(shù)組會(huì)被愉快地迭代:

my @a = 1, 2, 3;
my $s = @a;

for @a { ... }          # loop body executed 3 times
for $s { ... }          # loop body executed only once

my @flat = flat @a, @a;
say @flat.elems;        # 6

my @nested = flat $s, $s;
say @nested.elems;      # 2

你可以使用 @( ... ) 或通過(guò)在表達(dá)式身上調(diào)用 .list 方法來(lái)強(qiáng)制展平, 使用 $( ... ) 或通過(guò)在表達(dá)式身上調(diào)用 .item 方法強(qiáng)制為 item 上下文(不展平).

為什么還要符號(hào)? 你不能沒(méi)有它們嗎?

有幾個(gè)原因:

  • 它們使插值變量到字符串中變得更容易
  • 它們?yōu)椴煌淖兞亢?twigils 組成了微型命名空間, 因此避免了名字沖突
  • 它們?cè)试S簡(jiǎn)單的 單數(shù)/復(fù)數(shù) 區(qū)別
  • 它們像使用強(qiáng)制性名詞標(biāo)記的自然語(yǔ)言一樣工作,所以我們的大腦為處理它而生
  • 它們不是強(qiáng)制性的,因?yàn)槟憧梢月暶鳠o(wú)符號(hào)名字(如果你不介意含糊不清)

"類型 Str 不支持關(guān)聯(lián)索引"

你可能會(huì)把字符串插值和 HTML 搞混。

my $foo = "abc";
say "$foo<html-tag>";

Perl 6 認(rèn)為 $foo 是一個(gè)散列而 <html-tag> 是一個(gè)字符串字面量的散列鍵。使用閉包來(lái)幫助你理解吧。

my $foo = "abc";
say "{$foo}<html-tag>";

Perl 6 有協(xié)程嗎? 什么是 yield ?

Perl 6 沒(méi)有 Python 那樣的 yield 語(yǔ)句, 但是它通過(guò)惰性列表卻能提供類似的功能. 有兩種很潮的方式來(lái)寫出能返回惰性列表的例程:

# first method, gather/take
my @values := gather while have_data() {
    # do some computations
    take some_data();
    # do more computations
}

# second method, use .map or similar method
# on a lazy list
my @squares := (1..*).map(-> $x { $x * $x });
# or
my @squares = (1..*).map(-> \x { x2 });

為什么我需要反斜線(unspace)在多行上分割方法調(diào)用?

(請(qǐng)?jiān)谶@兒添加答案)

為什么我不能從 new 方法初始化私有屬性, 我怎么修復(fù)它?

這樣的代碼:


class A {
    has $!x;
    method show-x {
        say $!x;
    }
}
A.new(x => 5).show-x;

不會(huì)打印出 5. Private 屬性是私有的, 這意味著私有屬性在外面是不可見(jiàn)的. 如果默認(rèn)的構(gòu)造器能夠初始化私有屬性, 那么這些私有屬性就會(huì)泄露到公共 API 中.

如果你仍舊想讓它工作, 你可以添加一個(gè) submethod BUILD 來(lái)初始化它們:

class B {
    has $!x;
    submethod BUILD(:$!x) { }
    method show-x {
        say $!x;
    }
}
A.new(x => 5).show-x;

BUILD 由默認(rèn)的構(gòu)造器使用用戶傳遞給構(gòu)造器的所有具名參數(shù)調(diào)用(間接地, 更多細(xì)節(jié)查看Object Construction)。 :$!x 是名為 x 的具名參數(shù), 當(dāng)使用名為 x 的具名參數(shù)來(lái)調(diào)用時(shí), 它的值被綁定到屬性 $!x 上.

但不要這樣做。如果名字是 public 的,使用 $.x 以那樣的方式聲明沒(méi)有什么不好,因?yàn)槟J(rèn)情況下外部視圖是只讀的(readonly),你仍然可以使用 $!x 從內(nèi)部訪問(wèn)它。

say, put 和 print 怎么不同, 為什么不同?

最明顯的區(qū)別是, sayput 在輸出后面添加了一個(gè)換行符, 而 print 沒(méi)有.

但是還有另外一個(gè)區(qū)別: printput 通過(guò)對(duì)每一個(gè)傳遞來(lái)的 item 調(diào)用 Str 方法來(lái)把它的參數(shù)轉(zhuǎn)換為字符串, 相反, say 使用 gist 方法. 前者是為計(jì)算機(jī)設(shè)計(jì)的, 后者是為人類.

或者它倆被解析的方式不同, $obj.Str 給出一個(gè)字符串表示, $obj.gist 是對(duì)象的一個(gè)簡(jiǎn)短總結(jié), 適合編程人員的快速識(shí)別, $obj.perl 打印一個(gè) Perlish 的表示.

例如, 類型對(duì)象, 也是熟知的 “未定義值”, 字符串化為一個(gè)空的字符串和警告, 而 gist 方法返回由一對(duì)圓括號(hào)包裹的類型的名字.(用于表明除了類型之外什么也沒(méi)有).

my Date $x;     # $x now contains the Date type object
print $x;       # empty string plus warning
say $x;         # (Date)\n

所以, say 優(yōu)化的用于調(diào)試和向人們展示, printput 更適合于產(chǎn)生用于其它程序的輸出.

put 因此是 printsay 之間的一種混合; 像 print, 它的輸出適合于其它程序, 也像 say, 它在輸出的末尾添加了換行符。

token 和 rule 之間的區(qū)別是什么?

regex , tokenrule 這三個(gè)都引入了正則表達(dá)式, 但是語(yǔ)義略微有一點(diǎn)不同.

token 隱含了 :ratchet:r 修飾符, 這防止了 rule 的回溯.

rule 隱含了 :ratchet:sigspace (縮寫為 :s)修飾符, 這意味著規(guī)則(rule)不會(huì)回溯, 并且它把 regex 的文本中的空白當(dāng)作 <.ws> 調(diào)用(例如匹配空白, 除了在兩個(gè)單詞字符之間之外, 它是可選的). regex 開(kāi)頭的空白和備選分支中每個(gè)分支開(kāi)頭的空白會(huì)被忽略.

regex 聲明一個(gè)簡(jiǎn)單的正則表達(dá)式,沒(méi)有任何隱含的修飾符。

die 和 fail 之間的區(qū)別是什么?

die 拋出一個(gè)異常.

fail 返回一個(gè) Failure 對(duì)象。 (如果調(diào)用者已經(jīng)聲明了 use fatal; 在調(diào)用作用域中, fail 會(huì)拋出一個(gè)異常而不返回)

Failure 是一個(gè) “未知的” 或 “懶惰的” 異常.它是一個(gè)含有異常的對(duì)象, 當(dāng)這個(gè) Failure 被用作普通的對(duì)象或者在 sink 上下文中忽略它時(shí), 則會(huì)拋出一個(gè)異常.

Failure 從 defined 檢查中返回 False, 并且你可以使用 exception 方法提取出異常.

為什么 wantarray 或 want 不見(jiàn)了? 我能在不同的上下文中返回不同的東西嗎?

Perl 擁有 wantarray 函數(shù)來(lái)告訴你這是在空上下文, 標(biāo)量上下文,還是在列表上下文中調(diào)用的. Perl 6 沒(méi)有與之等價(jià)的結(jié)構(gòu), 因?yàn)樯舷挛牟皇窍騼?nèi)流動(dòng)的, 例如, 子例程不知道調(diào)用所在的上下文.

一個(gè)愿意是因?yàn)?Perl 6 有多重分派, 在這樣一個(gè)例子中:

multi w(Int $x) { say 'Int' }
multi w(Str $x) { say 'Str' }
w(f());

沒(méi)辦法決定子例程 f 的調(diào)用者想要一個(gè)字符串還是想要一個(gè)整數(shù), 因?yàn)樗€不知道調(diào)用者是什么. 通常這要求解決 halting 問(wèn)題, 在這個(gè)問(wèn)題上, 即使寫 Perl 6編譯器的人也會(huì)遇到麻煩.

在 Perl 6 中達(dá)到上下文敏感的方式是返回一個(gè)知道怎樣響應(yīng)方法調(diào)用的對(duì)象.

例如, regex 匹配返回 Match 對(duì)象, 該對(duì)象知道怎樣響應(yīng)列表索引, 散列索引, 并能變成匹配的字符串.

Pointer 和 OpaquePointer 的區(qū)別是聲明?

OpaquePointer 被廢棄了并且已經(jīng)用 Pointer 代替了。

Perl 6 實(shí)現(xiàn)

哪個(gè) Perl 6 的實(shí)現(xiàn)是可用的?

當(dāng)前開(kāi)發(fā)最好的是 Rakudo(使用多個(gè)虛擬機(jī)后端)。歷史上的實(shí)現(xiàn)還包括 Niecza (.NET) 和 Pugs (Haskell). 其它的列出在 Perl 6 Compilers 下面。

Rakudo 是用什么語(yǔ)言寫的?

NQP 是(1)NQP 代碼,(2)底層虛擬機(jī)使用的任何語(yǔ)言,(3)一些第三方 C 和 Java 庫(kù),以及(4)早期運(yùn)行構(gòu)建過(guò)程創(chuàng)建的一些引導(dǎo)文件的混合 。

為什么我不能把所有的數(shù)值都賦值給 Num 類型的變量?

my Num $x = 42;
# dies with
# Type check failed in assignment to '$x'; expected 'Num' but got 'Int'

Num 是浮點(diǎn)類型, 與 integers 不兼容. 如果你想要一個(gè)允許任何數(shù)字值的類型約束, 使用 Numeric (它也允許復(fù)數(shù)), 或 Real如果你想排除復(fù)數(shù).

元問(wèn)題和宣傳

Perl 6 什么時(shí)間會(huì)準(zhǔn)備好? 就是現(xiàn)在嗎?

編程語(yǔ)言和它們的編譯器的準(zhǔn)備就緒不是一個(gè)二元決策. 因?yàn)樗鼈?語(yǔ)言和實(shí)現(xiàn))能進(jìn)化, 它們平穩(wěn)地發(fā)展變得更可用. 根據(jù)你對(duì)編程語(yǔ)言的要求, 它可能適合也可能不適合你.

請(qǐng)查看 功能對(duì)比矩陣 了解更詳盡的實(shí)現(xiàn)了的功能.

請(qǐng)注意, Larry Wall 已經(jīng)在 FOSDEM 2015 會(huì)議上宣布, 一個(gè)產(chǎn)品級(jí)的 Rakudo Perl 6 將會(huì)在 2015 圣誕節(jié)發(fā)布.

為什么我要學(xué)習(xí) Perl 6? 它有什么了不起的嗎?

Perl 6 統(tǒng)一了很多其它編程語(yǔ)言中不經(jīng)常有的偉大想法. 雖然其中的幾種語(yǔ)言提供了其中的某些功能, 但是沒(méi)有提供全部.

不像大部分語(yǔ)言那樣, 它提供了:

  • Perl 6 提供了過(guò)程式的, 面向?qū)ο蟮暮秃瘮?shù)式編程方法。
  • 易于使用的一致性語(yǔ)法, 數(shù)據(jù)結(jié)構(gòu)中的符號(hào)不變性。
  • 完全基于字素的 Unicode 支持, 包括附件 #29
  • 足夠清晰的正則表達(dá)式, 更易讀, 更多功能。
  • Junctions 允許多個(gè)可能性的簡(jiǎn)單檢測(cè), 例如 $a == 1|3|42(意思是 $a 等于 1 或 3 或 42)
  • 相對(duì)于全局變量, 動(dòng)態(tài)作用域變量提供了詞法作用域備選
  • 強(qiáng)調(diào)可組合性和本地作用域以阻止「超距作用」。例如, imports 總是本地作用域的。
  • 易于理解的一致性作用域規(guī)則和閉包
  • 強(qiáng)大的面向?qū)ο? 含有類和 roles(所有的東西都可以當(dāng)做對(duì)象)。繼承、子類型、代碼復(fù)用。
  • 內(nèi)省到對(duì)象和元對(duì)象中(疊羅漢)
  • 元對(duì)象協(xié)議允許元編程而不需要生成/解析代碼。
  • 子例程和方法簽名,便于解包位置參數(shù)和命名參數(shù)。
  • 根據(jù)元數(shù),類型和可選的額外代碼使用不同的簽名對(duì)同一具名子例程/方法進(jìn)行多重分派。
  • 未知子例程/不可能的分派在編譯時(shí)給出錯(cuò)誤報(bào)告。
  • 可選的漸進(jìn)類型檢查,無(wú)需額外的運(yùn)行時(shí)成本。 還有可選類型注解。
  • 基于對(duì)編譯器/運(yùn)行時(shí)狀態(tài)的內(nèi)省的高級(jí)錯(cuò)誤報(bào)告。這意味著更有用,更精確的錯(cuò)誤信息。
  • Phasers(如 BEGIN/END) 允許代碼作用域 進(jìn)入/退出, 首次循環(huán)/last/next 和其它更多上下文中執(zhí)行。
  • 高級(jí)并發(fā)模型,用于隱式以及顯式多進(jìn)程處理,這超越了原始線程和鎖。 Perl 6 的并發(fā)提供了一組豐富的(可組合的)工具。
  • 多核計(jì)算機(jī)越來(lái)越多地被使用,由于并行性使得 Perl 6 可以使用多核,包括隱式(例如使用>>.方法)和顯式 (start {code}) 。這很重要,因?yàn)槟柖烧诮Y(jié)束。
  • 提供結(jié)構(gòu)化語(yǔ)言支持以實(shí)現(xiàn)異步執(zhí)行代碼的編程。
  • Supplies 允許在發(fā)生某些事情時(shí)執(zhí)行代碼(如定時(shí)器,信號(hào)或文件系統(tǒng)事件)。
  • react/whenever/supply 關(guān)鍵字允許容易地構(gòu)建交互式,事件驅(qū)動(dòng)的應(yīng)用程序。
  • 懶惰求值,如果可能的話,急切求值當(dāng)需要或必要時(shí)。這意味著,例如,惰性列表,甚至無(wú)限延遲列表,如斐波納契序列或所有素?cái)?shù)。
  • 原生數(shù)據(jù)類型用于更快的處理
  • 使用 NativeCall 連接到 C/C++ 中的外部庫(kù)非常簡(jiǎn)單。
  • 使用 Inline::Perl5 和 Inline::Python 連接 Perl 5(CPAN)/Python 非常簡(jiǎn)單。
  • 可以同時(shí)安裝和加載模塊的多個(gè)版本。
  • 由于更簡(jiǎn)單的更新/升級(jí)策略,簡(jiǎn)化了系統(tǒng)管理。
  • 簡(jiǎn)單的數(shù)值計(jì)算沒(méi)有損失精度,因?yàn)?Rats(有理數(shù))。
  • 用于解析數(shù)據(jù)或代碼的可擴(kuò)展語(yǔ)法(Perl 6 用它解析自身)
  • Perl 6 是一種非常易變的語(yǔ)言(定義自己的函數(shù),運(yùn)算符,traits 和數(shù)據(jù)類型,為您修改解析器)。
  • 很多的數(shù)據(jù)類型選擇,加上創(chuàng)建自己的類型的可能性。
  • 具有適當(dāng)邊界檢查的多維成型的和/或原生數(shù)組
  • 在某個(gè)匹配出現(xiàn)時(shí), 詞法解析期間隨時(shí)執(zhí)行代碼
  • 添加自定義運(yùn)算符或添加 trait 特征和編寫子例程一樣簡(jiǎn)單。
  • 在任何運(yùn)算符(系統(tǒng)或自定義添加的)上自動(dòng)生成超運(yùn)算符。
  • 運(yùn)行在各種后端上。目前 MoarVM 和 JVM,JavaScript在開(kāi)發(fā)中,可能會(huì)有更多。
  • 執(zhí)行期間(JIT)熱代碼路徑的運(yùn)行時(shí)優(yōu)化。
  • 運(yùn)行在小型(例如 Raspberry Pi)和大型多處理器硬件上。
  • 基于垃圾收集:沒(méi)有及時(shí)銷毀,所以引用計(jì)數(shù)沒(méi)有必要。使用 phasers 用以及時(shí)的動(dòng)作。
  • 方法可以在運(yùn)行時(shí)混合到任何實(shí)例化的對(duì)象中,例如。以允許添加帶外數(shù)據(jù)。
  • 通過(guò)使用具有多重分派和自動(dòng)生成使用信息的 MAIN 子例程,使命令行接口易于訪問(wèn)。
  • 更少的代碼行創(chuàng)建更緊湊的程序。名字的霍夫曼編碼允許更好的可讀性。
  • 使用簡(jiǎn)單的迭代器接口定義的惰性列表,任何類可以通過(guò)最小化的提供單個(gè)方法來(lái)提供。
  • Perl 6 的座右銘與 Perl一直保持不變:Perl是不同的。簡(jiǎn)而言之,Perl旨在"使容易的工作變得容易,使困難的工作變得可能"。和"條條大路通羅馬"?,F(xiàn)在有更多 -Ofun 添加進(jìn)來(lái)。

請(qǐng)查看 功能比較矩陣 獲取更多信息.

為什么不把它叫做除了 Perl 以外的其它東西?

很多人建議, Perl 6 跟之前的 Perl 版本的區(qū)別太大了, 我們應(yīng)該考慮給它改名, 或者考慮到 Perl 6 傷害了 Perl 5, 僅僅擁有同樣的名字卻有更高的版本號(hào).

Perl 6 仍然叫做 “Perl" 的主要原因是:

  • Perl 6 仍然是一個(gè) perlish 風(fēng)格的語(yǔ)言, 和之前的版本遵守相同的底層思想(用于微型命名空間的符號(hào), 條條大路通羅馬, 吸收了很多自然語(yǔ)言的思想..)
  • Perl 6 的代碼很 perlish.
  • Perl 仍然是一個(gè)強(qiáng)健的品牌名, 我們不想馬上拋棄它
  • 找到一個(gè)替代的名字很困難. 而且, “camelia” 和 “rakudo" 不是合適的編程語(yǔ)言名
  • 即使 Perl 6 更改了它的名字, Perl 5 也不大可能增加它的版本號(hào)為 6.因?yàn)?Perl 6 已經(jīng)根植于人們的頭腦中了

Perl 6 對(duì)我來(lái)說(shuō)足夠快了嗎?

那取決于你正在做什么。Perl 6 一直奉行“做對(duì)的事情然后做的更快”的哲學(xué)進(jìn)行開(kāi)發(fā)。對(duì)于某些東西來(lái)說(shuō)它夠快了, 但是需要做的更多。
Perl 6 大部分是由志愿者開(kāi)發(fā)的, 但是 Perl 6 的性能在不久的將來(lái)有待提高, 因?yàn)?MoarVM 后端包含一個(gè)現(xiàn)代的即時(shí)(JIT)編譯器。
Perl 5 程序員應(yīng)該意識(shí)到 Perl 6 在面向?qū)ο蠓矫嬗泻芏鄡?nèi)建函數(shù)并且還有更多其它的。
簡(jiǎn)單的基準(zhǔn)測(cè)試會(huì)誤導(dǎo)除非你在你的 Perl 5腳本中包含了諸如 Moose, 類型檢測(cè)模塊等。

下面這個(gè)粗超的基準(zhǔn)測(cè)試, 使用了所有諸如此類的一般說(shuō)明, 能展示 Perl 6 在某些類似任務(wù)上能和 Perl 5的速度接近。
在你的系統(tǒng)上嘗試下, 你可能會(huì)感到很驚訝!

# Perl 6 version
use v6;

class Foo { has $.i is rw };

for (1..1_000_000) -> $i {
    my $obj = Foo.new;
    $obj.i = $i;
}

# Perl 5 version
package Foo;
use Moose;

has i => (is => 'rw');

__PACKAGE__->meta->make_immutable;

for my $i (1..1_000_000) {
    my $obj = Foo->new;
    $obj->i($i);
}

1;

# Another Perl 5 version that offers bare-bones set of features
# compared to Moose/Perl 6's version but those are not needed in this
# specific, simple program anyway.
package Foo;
use Mojo::Base -base;

has 'i';

for my $i (1..1_000_000) {
    my $obj = Foo->new;
    $obj->i($i);
}

1;

# A perl program which works under both perl5 (with perl -Mbigint)
# and perl6

my ($prev, $current) = (1, 0);

for (0..100_000) {
    ($prev, $current) = ($current, $prev + $current);
}
print $current;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Perl 6 是 Perl 編程語(yǔ)言家族中的一員. 它仍舊在開(kāi)發(fā)中, 幾個(gè)解釋器和編譯器在同時(shí)進(jìn)行. 它引入了很多...
    焉知非魚閱讀 1,052評(píng)論 0 2
  • 第一章 概要 Comming soon! 第二章 基礎(chǔ) 假設(shè)有一場(chǎng)乒乓球比賽,比賽結(jié)果以這種格式記錄:Player...
    焉知非魚閱讀 391評(píng)論 0 0
  • 標(biāo)題: Rakudo and NQP Internals子標(biāo)題: The guts tormented imple...
    焉知非魚閱讀 1,514評(píng)論 1 3
  • 2009 有用的和有意思的循環(huán) 讓我們來(lái)看一個(gè)基本的例子. 這是一個(gè)最簡(jiǎn)單清晰的語(yǔ)法的例子.在這并沒(méi)有使用括號(hào)來(lái)包...
    焉知非魚閱讀 651評(píng)論 0 0
  • 2010 第二天:用main函數(shù)控制命令行交互 2010 年 Perl6 圣誕月歷(二)用 main 函數(shù)控制命令...
    焉知非魚閱讀 619評(píng)論 0 0

友情鏈接更多精彩內(nèi)容