【发布时间】:2016-01-06 13:37:17
【问题描述】:
假设我想使用只是 Perl6 子集的简单语言作为扩展/可嵌入语言来“编写”我自己的 Perl 6 程序。 例如让这种语言只有:
- 变量声明
- 表达式
- 文字
使用 Perl6 语法,并且可能是非常有限的内置函数子集。
除此之外的任何事情都应该导致编译错误,并且不应该
执行。
是否可以(重新)使用 Rakudo 编译器,或者只能通过手写的解释器/编译器来完成?
让我澄清一下我这样做的动机。
- 使用(子集)宿主语言(在本例中为 Perl 6)作为
用于编写脚本/应用程序的配置文件的 DSL 语言
宿主语言。
这可以通过 EVAL 完成 (perl6 'do(file)' equivalent), 但它根本不安全,因为无法控制 EVAL 可以做什么。 - 使用宿主语言(子集)作为扩展/脚本语言 用宿主语言编写的应用程序。很像编写 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 的解释