2

我正在寻找一种将数据描述(如 YAML 或 JSON)与基本脚本功能(例如变量、条件表达式、回调函数)混合在一起的语言。描述列表和映射的层次结构的东西,如 YAML,但叶值是函数而不是文字数据。

到目前为止,我一直在通过在 YAML 之上添加表达式逻辑来解决这个问题。这让我可以在现有的解析器上构建,但它也会导致非常尴尬的语法,我必须自己实现它的编译器/解释器方面。我不认为我有能力做到这一点。

另一种方法是采用现有语言的某个子集,这样我就可以构建一个真正的编译器。遗憾的是,我并不精通任何函数式编程语言。老实说,我不知道从哪里开始。

任何人都可以建议一种具有部分或全部这些属性的函数式语言:

compact syntax for expressing hierarchical lists and maps
pure functional
lexical scoping
no OOP (using maps rather than static compound types)
first class functions (primary data structures will be lists/maps of functions)
type inference
compilable from an AST (if I have to write my own parser)
compilable to JVM bytecode (it would make my life a lot easier)

Scala 是一个显而易见的选择,因为它以 JVM 为目标,但据我所知,那里可能有更接近我需要的东西。有什么建议么?

4

4 回答 4

1

Clojure是最合适的。

  • 地图和列表的紧凑语法- 是
  • 纯功能- 不像 Haskell 那样纯,但功能足够
  • 词法作用域- 是
  • 无 OOP - 这是从头开始编写代码库时的首选架构
  • 一流的功能- 是的
  • 类型推断- 支持类型提示的动态类型系统
  • 可从 AST 编译- Clojure 语法几乎是 AST 开头
  • 可编译为 JVM 字节码- 是

我认为它比 Scala 更合适,原因如下:

  • 更多的功能和更少的面向对象的风格
  • 地图和列表的更紧凑的语法
  • 语法更接近 AST,更容易解析
于 2013-10-15T11:38:39.180 回答
0

查看PyYAML。看起来还算完整。

问题是,Python 并不能满足您的所有要求,尽管它确实满足了一些要求。所以对你来说:

优点:

缺点:

  • 静态作用域,非词法作用域
  • 这是面向对象的,但鉴于您可以在功能上使用它,我不确定为什么这会伤害您
  • 没有类型推断,但一个好的 IDE 会在你编码时警告你......
于 2014-11-14T17:46:42.730 回答
0

其他选项可能更合适(提到了 Clojure),但这里有一个例子,你可以用 Ruby 做什么。(JRuby 可以编译到 JVM)。Ruby 哈希语法足够方便——除非有其他依赖项,否则不需要其他格式。注意 lambdas 的任意“src”参数

to_lambdas = lambda{ |m|
    m.respond_to?(:map) ?
    Hash[
      m.map{ |k, v| [ k, to_lambdas[v||k] ] } # Paired array to hash
    ] : lambda{ |src| eval(m.to_s) }
  }
to_values = lambda{ |m, src_doc|
    m.respond_to?(:map) ?
    Hash[
      m.map{ |k, v| [ k, to_values[v||k, src_doc] ] }
    ] : m[src_doc]
  }
# Target structure with function definitions:
instructions = {
    a: { a: 'src[:b][:b]', b: 'src[:b][:a]' },
    b: { a: 'src[:a][:b]', b: 'src[:b][:c].upcase' }
  }
# Source structure with data:
src = {
    a: { a: 'aa', b: 'ab' }, 
    b: { a: 'ba', b: 'bb', c: 'wat' }
  }

lambdas = to_lambdas[ instructions ]
tgt_doc = to_values[lambdas, src]
puts tgt_doc.to_s
于 2013-10-22T21:51:00.977 回答
0

这是一个有趣的用例。听起来有点像 YAML 中描述并用于构建计算图的 Common Workflow Language

于 2019-05-04T18:04:22.087 回答