首页 > 解决方案 > 领域特定语言/功能的工具

问题描述

我们的用户可以输入学生回答的问题。我们的用户需要一种可扩展、灵活的方式来定义这些问题的正确答案(存储为一个简单的字符串)。

我想公开一个特定领域的函数库,用户可以调用它来描述正确的答案。例如:

exact_match("puppy") // means the correct answer is the string 'puppy'

或者

contains("yesterday") // means any answer with the word 'yesterday' is correct

天真的实现将涉及在沙盒运行时(如 javascript vm 或 ruby​​ vm)中评估用户提供的字符串。但我想更进一步,只允许调用特定的函数。任何其他脚本都将被丢弃。这样:

puts("foo"); contains("yesterday")

将是非法的。由于我们不公开或允许puts().

如何将执行环境限制为仅运行功能白名单?或者是否有不同的方法来构建这种面向外部的 DSL,而不是试图将现有语言限制为功能子集?

标签: dsl

解决方案


如果我是你,我会检查 JetBrains 的MPS,它是一个开源 DSL 创建工具。我自己从未使用过它,但从我所看到的一切来看,它非常直观;他们所有的其他产品都非常强大。


推荐阅读