代码之家  ›  专栏  ›  技术社区  ›  Aakash Goel

Perl提供了哪些其他语言没有的编译时特性?

  •  4
  • Aakash Goel  · 技术社区  · 14 年前

    Perl被认为是一种通用编程语言吗?

    继续读下去 Wikipedia

    Perl有一个图灵完全语法,因为解析可能会受到编译阶段执行的运行时代码的影响。[41]因此,Perl不能直接由Lex/Yacc lexer/parser组合来解析。相反,解释器实现它自己的lexer,它与一个修改过的GNU bison解析器协调来解决语言中的歧义。

    人们常说“只有perl可以解析perl”,这意味着只有perl解释器(perl)才能解析perl语言(perl),但即使这样,一般情况下也不是这样。因为Perl解释器可以在编译阶段模拟图灵机,所以它需要决定停止问题,以便在每种情况下完成解析。长期以来,停止问题是无法确定的,因此甚至perl也不能总是解析perl。Perl做出了一个不同寻常的选择,让用户在自己的编译阶段访问它的全部编程能力。从理论上讲,成本很高,但实际操作上的不便似乎很少。

    因此,它说尽管Perl有图灵完备的徽章,但它与其他语言不同,因为它允许“用户在自己的编译阶段使用它的全部编程能力”。那是什么意思? Perl在编译阶段为我提供了其他人没有的编程能力?

    3 回复  |  直到 4 年前
        1
  •  6
  •   Axeman maxelost    14 年前

    Perl的任何特性都不会出现在任何其他语言中。Lisp可以做任何事情(Lisp是 例子

    • BEGIN 改变行为的块(也可以是结束块) 在期间

      use Frobnify;
      Frobnify->new->initialize;
      

      因为我可以更改Frobnify加载的位置:

      BEGIN { 
          if ( [ localtime ]->[6] == 2 ) { 
              s|^/var|/var/days/tuesday| foreach @INC;
          }
      }
      

      所以每周二,我都会 /var/days/tuesday/perl/lib/Frobnify.pm

    • Source Filters

    • 开始 积木是 @INC hooks @公司 一开始看到的是改变加载的内容。我可以在 @公司 Frobnify 并通过加载来响应它 Defrobnify.pm

    • 与此同时出现的还有符号操纵。装载后 去robnify.pm

      *Frobnify:: = \*Defrobnify::;
      

      现在 Frobnify->new 创建一个 Defrobnify

        2
  •  4
  •   Eric Strom    14 年前

    子例程原型是一种编译时特性,或多或少是Perl独有的。许多Perl的内置函数在它们的参数(标量、列表、引用、代码块、捕获)上施加特殊类型的上下文。原型是将某些功能移植到用户定义的子例程上的一种方法。

    (&) 原型。这在模块中使用,比如 Try::Tiny 添加 try catch 语言关键词:

        try {
                die "foo";
        } catch {
                warn "caught error: $_"; # not $@
        };
    

    这样做是因为 尝试 声明为 sub try (&;@) { ... } sub name {...} BEGIN { *name = sub {...} } 这意味着它具有编译时效果。在下列情况下 尝试 ,的 (&;@) 尝试 ,第一个参数必须是空块,块后面是可选列表。

    $  imposes scalar context on an argument
    &  imposes code context on an argument
    @  imposes list context on an argument
    %  imposes list context (with an even number of elements)
    *  imposes glob context on the argument 
    \$ imposes scalar reference context
    \@ imposes array reference context
       ... for the rest of the sigils
    

    由于其强大的功能(以及在其他语言中的缺失),原型可能会令人困惑,最好适度使用。(就像Perl的其他高级特性一样)。

        3
  •  1
  •   Philip Potter    14 年前

    简单的答案是 BEGIN 块提供图灵完整性:

    BEGIN {
        my $foo = turing_machine_simulator($program);
    }