Perl 6 的薛定諤的貓 - Junctions

薛定諤歐文應(yīng)該是喜歡 Perl 6 的, 因為他的著名的薛定諤的貓可以用 Perl 6 的 Junction表達(dá):

my $cat = 'dead' | 'alive';
say "cat is both dead and alive" if $cat eq 'dead' and $cat eq 'alive';

# OUTPUT:
# cat is both dead and alive

這里面發(fā)生了什么事情? 我會告訴你全部的!

Anyone 游戲?

拿最簡單的來說, Junctions 允許你把一堆值當(dāng)作單個值闪水。例如, 你可以使用 any Junction 來測試一個變量是否等于所給定值中的任意一個:

say 'it matches!' if 'foo' eq 'foo' | 'bar' | 'ber';
say 'single-digit prime' if 5 == any ^9.grep: *.is-prime;

my @values = ^100;
say "it's in there!" if 42 == @values.any;

# OUTPUT:
# it matches!
# single-digit prime
# it's in there!

要從一堆值中創(chuàng)建一個 any Junction, 你可以使用 | 中綴操作符、調(diào)用 any 函數(shù)或者使用 .any 方法偿警。上面的條件會返回 True 如果 Junction 中的任意一個(any) 值匹配所給定的值的話晾匠。事實上, 沒有人能阻止你在兩端都使用 Junction:

my @one = 1..10;
my @two = 5..15;
say "There's overlap!" if @one.any == @two.any;

# OUTPUT:
# there's overlap!

運算符會返回 True 如果 @one 中的任意一個值(any) 在數(shù)值上等于 @two 中的任意一個值(any)的話匣吊。這個語法糖很甜, 但是我們還可以做的更多。

All for One and Any for None

any Junction 唯一一個你能獲得的 Junction奏瞬。你還可以選擇 all衷模、any指黎、onenone朋凉。當(dāng)在布爾上下文中時, 它們的意思就像下面這樣; 構(gòu)建 Junction 的函數(shù)/方法名和 Junction 自身的名字一樣并且下面還列出了構(gòu)建 Junction 的中綴操作符:

  • all — 所有的值都被計算為 True(使用中綴 &)
  • any — 至少其中的一個值被計算為 True(使用中綴 |)
  • one — 正好其中有一個值被計算為 True(使用中綴 ^)
  • none — 沒有一個值被計算為 True(沒有可用的中綴)

使用 all JUnction 時要特別注意:

my @values = 2, 3, 5;
say 'all primes' if @values.all ~~ *.is-prime;

my @moar-values;
say 'also all primes' if @moar-values.all ~~ *.is-prime;

即使它沒有值的時候也會返回 True, 這可能不是你想要的。在那些情況下, 你可以使用:

my @moar-values;
say 'also all primes' if @moar-values and @moar-values.all ~~ *.is-prime; 

Call Me, Baby

你可以把 Junctions 用作并不期望 Junction 的子例程的參數(shù)醋安。那么會發(fā)生什么呢? 對于每一個 Junctioned 的值, 那個子例程都會被調(diào)用一次, 并且返回值會是一個 Junction:

 sub caculate-things($n) {
     say "$n is prime"          if $n.is-prime;
     say "$n is an even number" if $n %% 2;
     say "$n is pretty big"     if $n > 1e6;
     $n2;
 }
 
my @values = 1, 5, 42, 1e10.Int;
say 'EXACTLY ONE square is larger than 1e10'
    if 1e10 < calculate-things @values.one;

# OUTPUT:
# 5 is a prime
# 42 is an even number
# 10000000000 is an even number
# 10000000000 is pretty big
# EXACTLY ONE square is larger than 1e10

暴露的副作用可能有點太過神奇并且你可能不想在生產(chǎn)代碼中看到它, 但是使用一個子例程來修改原來的 Junctioned 化的值是相當(dāng)能接受的杂彭。執(zhí)行一個數(shù)據(jù)庫查詢來獲取"實際的"值并且在之后計算那個條件怎么樣:

use v6;
use DBIish;

my $dbh = DBIish.connect: 'SQLite', :database<test.db>;

sub lookup ($id) {
    given $dbh.prepare: 'SELECT id, text FROM stuff WHERE id = ?' {
        .execute: $id;
        .allrows[0][1] // '';
    }
}

my @ids = 3, 5, 10;
say 'yeah, it got it, bruh' if 'meow' eq lookup @ids.any;

# OUTPUT (the database has a row with id = 5 and text = 'meow'):
# yeah, it got it, bruh

我們一直在期盼你, 請坐。

那個游戲變化了當(dāng)你的子例程正好期望一個 Junction 作為參數(shù)的時候吓揪。

sub do-stuff (Junction $n) {
    say 'value is even'  if $n %% 2;
    say 'value is prime' if $n.is-prime;
    say 'value is large' if $n > 1e10;
}

do-stuff (2, 3, 1e11.Int).one;
say '---';
do-stuff (2, 3, 1e11.Int).any;

# OUTPUT:
# value is large
# ---
# value is even
# value is prime
# value is large

當(dāng)我們提供了一個 one Junction 時, 只有正好滿足給定值中的其中一個條件才會被觸發(fā)亲怠。當(dāng)我們提供一個 any Junction 時, 滿足條件的任何一個給定值都會觸發(fā)。

但是! 你沒有必要非等著世界為你分發(fā) Junctions柠辞。你自己制造一個怎么樣呢, 還能在測試條件時節(jié)省代碼:

sub do-stuff (*@v) {
    my $n = @v.one;
    say "$n is even"  if $n %% 2;
    say "$n is prime" if $n.is-prime;
    say "$n is large" if $n > 1e10;
}

do-stuff 2, 3, 1e11.Int;
say '---';
do-stuff 42;

# OUTPUT:
# one(2, 3, 100000000000) is large
# ---
# one(42) is even

沒有人想過將來嗎?

還有一個小秘密: Junctions 被設(shè)計為時自動線程化的(即 auto-threaded)团秽。盡管在寫這篇文章的時候它們只會使用僅僅一個線程, 你不應(yīng)該依賴它們能以任何可預(yù)測的順序被執(zhí)行。自動線程化會在 2018 年的某個時間被實現(xiàn), 所以保持關(guān)注... 你不必做任何事情, 你的值得自動線程化的復(fù)雜 Junctioned 化的操作可能會在幾年之內(nèi)變得更快叭首。

結(jié)論

Perl 6 的 Junctions 是值的疊加態(tài), 它允許你測試多個值就像它們是一個值一樣习勤。除了提供非常短并且易讀的語法, Junctions 還允許你使用子例程變換疊加值或者使用副作用。

你還可以生成顯式操作 Junctions 的子例程或者把提供的多個值轉(zhuǎn)換成 Junctions 以簡化代碼焙格。

最后, Junctions 被設(shè)計為能使用所有你計算機(jī)所提供的可用能力并且在不久的將來會做成自動線程化图毕。

Junctions 很精彩, 使用它們, 玩的開心!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市眷唉,隨后出現(xiàn)的幾起案子予颤,更是在濱河造成了極大的恐慌囤官,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛤虐,死亡現(xiàn)場離奇詭異党饮,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)笆焰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門劫谅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嚷掠,你說我怎么就攤上這事捏检。” “怎么了不皆?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵贯城,是天一觀的道長。 經(jīng)常有香客問我霹娄,道長能犯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任犬耻,我火速辦了婚禮踩晶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘枕磁。我一直安慰自己渡蜻,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布计济。 她就那樣靜靜地躺著茸苇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沦寂。 梳的紋絲不亂的頭發(fā)上学密,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天,我揣著相機(jī)與錄音传藏,去河邊找鬼腻暮。 笑死,一個胖子當(dāng)著我的面吹牛毯侦,可吹牛的內(nèi)容都是我干的西壮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼叫惊,長吁一口氣:“原來是場噩夢啊……” “哼款青!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起霍狰,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤抡草,失蹤者是張志新(化名)和其女友劉穎饰及,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體康震,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡燎含,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了腿短。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屏箍。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖橘忱,靈堂內(nèi)的尸體忽然破棺而出赴魁,到底是詐尸還是另有隱情,我是刑警寧澤钝诚,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布颖御,位于F島的核電站,受9級特大地震影響凝颇,放射性物質(zhì)發(fā)生泄漏潘拱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一拧略、第九天 我趴在偏房一處隱蔽的房頂上張望芦岂。 院中可真熱鬧,春花似錦垫蛆、人聲如沸禽最。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弛随。三九已至瓢喉,卻和暖如春宁赤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背栓票。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工决左, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人走贪。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓佛猛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親坠狡。 傳聞我的和親對象是個殘疾皇子继找,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 2009 有用的和有意思的循環(huán) 讓我們來看一個基本的例子. 這是一個最簡單清晰的語法的例子.在這并沒有使用括號來包...
    焉知非魚閱讀 549評論 0 0
  • 操作符 操作符優(yōu)先級 在像 1 + 2 * 3 這樣的表達(dá)式中, 2 * 3 被首先計算逃沿, 因為中綴操作符 * ...
    焉知非魚閱讀 1,399評論 0 1
  • 2016-10-20 號更新婴渡。 源文件可以在 github 或 perl6.org上找到. General Rak...
    焉知非魚閱讀 977評論 0 0
  • 第一章 概要 Comming soon! 第二章 基礎(chǔ) 假設(shè)有一場乒乓球比賽幻锁,比賽結(jié)果以這種格式記錄:Player...
    焉知非魚閱讀 339評論 0 0
  • Perl 6 是 Perl 編程語言家族中的一員. 它仍舊在開發(fā)中, 幾個解釋器和編譯器在同時進(jìn)行. 它引入了很多...
    焉知非魚閱讀 818評論 0 2