【问题标题】:compile and execute program written in subset of perl6 with rakudo用 rakudo 编译和执行用 perl6 子集编写的程序
【发布时间】:2016-01-06 13:37:17
【问题描述】:

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

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

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

除此之外的任何事情都应该导致编译错误,并且不应该 执行。

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

让我澄清一下我这样做的动机。

  1. 使用(子集)宿主语言(在本例中为 Perl 6)作为 用于编写脚本/应用程序的配置文件的 DSL 语言 宿主语言。
    这可以通过 EVAL 完成 (perl6 'do(file)' equivalent), 但它根本不安全,因为无法控制 EVAL 可以做什么。
  2. 使用宿主语言(子集)作为扩展/脚本语言 用宿主语言编写的应用程序。很像编写 Blender 的脚本 Python 或 WoW 与 Lua。我猜在这种情况下需要带有一些 API 的应用程序核心?但究竟应该/可以怎么做呢?

但是,为什么还要为配置/脚本编写宿主语言? 对于 conf 文件,我不喜欢使用 YAML 或 JSON 等“外语”,因为:

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

在扩展/脚本的情况下:同样,我看不出有任何理由将 Lua 或 Python 用于 Perl 6 应用程序,但我也不喜欢发明自己的扩展/脚本语言和编写解释器/编译器的想法在 Perl 6 中为它 如果我已经有 Perl 6/Rakudo。

【问题讨论】:

  • 不允许 perl6 表达式就像允许大多数 perl6 一样吗?
  • @sftf 据我了解...理论上可以 A)从常规的 Perl 6 语法继承并削减它 B)创建一个适当的自定义“设置”来处理“有限的内置功能子集”方面......在实践中,A)和B)可能会变得越来越痛苦,因为你削减的东西越少,收益越少:创建和部署替代品以解决更具挑战性的引导作弊问题.这绝对取决于您的具体目标,但我怀疑在 2016 年使用 Perl 6 编写的编译器以回溯到 Perl 6 的新语言会容易得多。
  • @sftf 您是否正在替换已经编写好的系统、玩弄创意、建立业务......?
  • @raiph 我在“玩弄想法”...
  • @raiph 我添加了一些关于 subj 的解释

标签: dsl raku


【解决方案1】:

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

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

另外,JSON 是一种相当不错的数据结构。如果您需要简单,它可以很简单,但您可以将它用于非常复杂的配置,使用嵌套散列和数组,几乎可以任意组合。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这种方法不能防止使用不需要的语言片段,也不能防止不需要的代码被执行(想想 BEGIN 块和朋友),而且 Perl 6 表达式不太可能定义对代码完全可以工作;根本没有 API 用于自省 Block 对象背后的代码。
    • 那么唯一的办法就是使用语法重新定义 Perl 6,我猜...
    猜你喜欢
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多