关于 Perl 6 你要知道的 10 件事情

Ten Things You Need To Know about Perl 6

Jeffrey Goff, Evozon Systems LLC
OSCON London 2016
https://github.com/drforr
http://theperlfisher.blogspot.ro

资源

要闻

  • 干净, 一次性的可解析的文法
  • 对用户友好的错误信息
  • 友好的 Unicode
  • 对初学者有帮助的符号
  • Math that works
  • 函数签名
  • 用正则表达式引导
  • OO with a type lattice built on a Metaprogramming model
  • 自定义运算符
  • 内置并发

一次性文法

my @doctor = { :first('Christopher'), :last('Eccleston'), years => 1 },
             { :first('David'),       :last('Tennant'),   years => 4 },
             { :first('Matt'),        :last('Smith'),     years => 4 },
             { :first('Peter'),       :last('Capaldi'),   years => 3 };

say 'First New Who Doctor: ', @doctor[0]{'first'}, ' ', @doctor[0]<last>;

say "Average run: " ~ @doctor.elems R/ sum map { .<years> }, @doctor;

R/ 运算符会对调两边的表达式再进行计算。

my %hash := {  :name('Larry Wall'), :sex('male')  }; # {name => Larry Wall, sex => male}
say %hash{'name'}; #     Larry Wall
say %hash.<name>;  #     Larry Wall

访问散列的键值的另外一种语法是 %hash.<key>, 尖括号自动为 key 添加引号。

错误信息

sub mean( @a ) {
  my $sum = sum( @a )
  ( $sum / @a.elems )
}
say mean 1, 2, 4;
$ perl6 test.pl6

Two terms in a row across lines (missing semicolon or comma?)
at /home/jgoff/test.pl6:2
------>   my $sum = sum( @a )⏏<EOL>
    expecting any of:
        infix
        infix stopper
        postfix
        statement end
        statement modifier
        statement modifier loop

Unicode Friendly

my $α = 2 + ⅒  ; 

say $α ÷ 2;

# 1.05

Or, really old-school

use Slang::Roman;

say 0rↀ  + 0rDCLXVI;

# 1666

my $a = 0rIV / 0rM;

say $a;

# 0.004

This is really just a teaser to show off how powerful the internals really are.
The module itself is a bit too complex to show, but I like to think that the
fact that I can go in and muck about with the actual grammar, changing how
numbers are read and stored internally speaks volumes.

有意义的符号

my @powers = 1, 2, 4, 8;

my %foo = :name('Jeff'), :division('Programming');

say @powers[ 1, 2 ];

say %foo<name>;

# (2 4)

# Jeff

浮点数

$ perl -E 'say 0.1 + 0.2 - 0.3'

+5.55111512312578e-17

+$ ruby -e 'print 0.1 + 0.2 - 0.3'

+5.55111512312578e-17

+$ python -c 'print 0.1 + 0.2 - 0.3'

+5.55111512312578e-17

+$ perl6 -e 'say 0.1 + 0.2 - 0.3'

+0

+$ perl6 -e'say (0.1).nude'

+(1 10)

函数签名

sub plus( Int $a, Int $b ) {
    $a + $b
}

say plus 1, 2;

# 3

say plus 1, 2, 3;
===SORRY!=== Error while compiling -e
Calling a(Int, Int, Int) will never work with declared signature
(Int $a, Int $b)
at -e:1
------> ub foo( Int $a, Int $b ) { $a + $b }; say ⏏foo 1, 2, 3;

不那么正规的表达式

my $id = '[ { "first": "Christopher", "last": "Eccleston", "id": 1 } ]';

my regex Str     { '"' (<-[ " ]>+) '"' };
my regex Integer {         \d+         };

my regex Value {                       <Integer> | <Str>               };

my regex Pair  {             <Str> ':' \s+ <Value>                     };
my regex Pairs {     '{' \s+       <Pair>+    %% (',' \s+) \s+ '}'     };
my regex List  { '[' \s+           <Pairs>+   %% (',' \s+)     \s+ ']' };

$id ~~ m{ <List> };

say $/;

面向对象

enum Chirality <left right>;
enum Effort <minimum average maximum>;

class Hand {
    has Chirality $.chirality;
    has $.content; 
}

role Humanoid {
    has Hand $.left-hand  .= new( :chirality( left ) );
    has Hand $.right-hand .= new( :chirality( right ) );
}

class Character does Humanoid {
    has Str $.name is required;
    has Int @.Attr where 0 < * <= 18;

    method attack( Character $enemy, Effort $effort ) { ... } 
}

class Sword { has Int $.Dmg }

my $Wade = Character.new(:name('Wade'));
$Wade.left-hand.content = Sword.new( Dmg => 5 );
$Wade.right-hand.content = Sword.new( Dmg => 5 );

my $Francis = Character.new(:name('Francis'));

$Wade.attack($Francis,maximum);

看呐,合适的列表!

my $fh = open 'sample.tsv', :r;

my @line;
for $fh.lines -> $line {
    my ( $id, $last-name, $first-name ) =
        $line.chomp.split( "\t" );
    @line[$id - 1] = $last-name, $first-name;
}

close $fh;

say @line;

# [("Tyler", "Rose"), ("Smith", "Mickey"),
   ("Jones", "Martha"), ("Noble", "Donna")]

自定义运算符

multi sub prefix:<∑>( *@values ) {
    [+] @values
}

my $total = ∑ 0 ... ∞;
    
multi sub postfix:<⁺>( $x ) { $x.charge( +1 ) }
multi sub postfix:<⁻>( $x ) { $x.charge( -1 ) }
multi sub prefix:<√>( $x ) { sqrt( $x ) }

W⁺ = (-W¹ + iW²)/√2 ;
W⁻ = (-W¹ + iW²)/√2 ;

Perl 6 风格

for 'sample.txt'.IO.lines.kv -> $index, $line {
    my ( $method, $id, $name, timestamp ) = $line.chomp.split( "\t" );

    given $method {
        when 'create'   { %object{$id} = $name, $timestamp }
        when 'delete'   { %object{$id}:delete }
    }
    if $method eq 'read' | 'update' | 'delete' {
        say "missing object on line $index" unless %object{$id}
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容

  • 2009 有用的和有意思的循环 让我们来看一个基本的例子. 这是一个最简单清晰的语法的例子.在这并没有使用括号来包...
    焉知非鱼阅读 553评论 0 0
  • 公共类(框架) YTTabBarController
    写啥呢阅读 306评论 0 1
  • 低碳生活是对现代生活的优化,是节能环保的必然选择。 低碳生活重要在“低”上,所以减少碳排放量是十分必要的。在日常生...
    风_d23b阅读 346评论 0 0
  • 目 录 下一章 我的天呐,我发现了什么!就在十分钟前,我正好死不死一脸寡妇脸的瘫散在床上边翘着二郎腿抠脚,边用迷...
    一枚少年阅读 551评论 6 49