使用rakudo编译和执行用perl6子集编写的程序

时间:2016-01-06 13:37:17

标签: dsl perl6

假设我想使用只是Perl6的子集的简单语言作为扩展/嵌入语言来“编写”我自己的Perl 6程序。 例如,让这种语言只有:

  • 变量声明
  • 表达式
  • 文字

使用Perl6语法,可能是内置函数的非常有限的子集。

除此之外的任何内容都应该导致编译错误,不应该 执行。

是否可以(重新)使用Rakudo编译器,或者只能通过手写的解释器/编译器来完成?

让我澄清一下我的动机。

  1. 使用(子集)宿主语言(在本例中为Perl 6)作为 用于编写脚本/应用程序的配置文件的DSL语言 主持语言。
    这可以通过EVAL完成 (perl6 'do(file)' equivalent), 但它根本不安全,因为无法控制EVAL可以做什么。
  2. 使用(子集)宿主语言作为扩展/脚本语言 用宿主语言编写的应用程序就像编写Blender脚本一样 Python或WoW与Lua。我想在这种情况下需要使用某些API的app核心?但究竟应该/可以做到什么?
  3. 但是,为什么还要为配置/脚本编写主机语言? 在conf文件的情况下,我不喜欢使用像YAML或JSON这样的“外语”,因为:

    • 将数据从这些格式转换为本机Perl6内存数据结构所需的额外代码/库,但我们已经拥有所有(语言和编译器)来表达conf的内容;
    • conf文件可以使用主机语言代码(即回调)和编译时检查;
    • 在我的情况下,
    • conf文件的可移植性不是问题;

    在扩展/脚本的情况下:再次,我没有看到任何理由使用Lua或Python for Perl 6应用程序,但我再次不喜欢发明我自​​己的扩展/脚本语言和编写解释器/编译器的想法在Perl 6中 如果我已经有Perl 6 / Rakudo。

2 个答案:

答案 0 :(得分:1)

我知道这不是您正在寻找的答案,但我认为JSON可以很好地处理大多数配置。 JSON在JavaScript社区之外被广泛接受。许多语言都使用它。事实上,JSON::Fast附带了Rakudo-Star(由it's json_fast submodule证明)。你可以使用这个单行程序将JSON文件转换为Perl 6数据结构(好吧,包括use JSON::Fast在内的两行文件):

use JSON::Fast;
my %json = from-json(slurp($filename));

此外,JSON是一个相当不错的数据结构。如果您需要简单,它可以很简单,但您可以使用嵌套的哈希和数组进行非常复杂的配置,几乎任何组合。

答案 1 :(得分:0)

Perl 6代码可以是abstracted into Blocks。您可以声明块类型变量,也可以使用where声明块的子集。如果您能够将Perl 6块的限制表达为Perl 6表达式,则可以轻松创建Perl 6的子集,并结合这些约束。那么你的DSL将会是 您声明的(子)类型的有效对象。