寻找一种基于YAML的功能性编程语言

3
我正在寻找一种语言,它能够将数据描述(例如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个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
1

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


1

Clojure是最佳选择。

  • 紧凑的映射和列表语法 - 是的
  • 纯函数式编程 - 不如Haskell纯,但足够函数式
  • 词法作用域 - 是的
  • 无面向对象编程 - 从头开始编写代码库时这是首选架构
  • 一等函数 - 是的
  • 类型推断 - 动态类型系统,支持类型提示
  • 可编译自AST - Clojure语法本身就几乎是一个AST
  • 可编译为JVM字节码 - 是的

我认为它比Scala更适合的原因有:

  • 更加函数式,不太面向对象
  • 更紧凑的映射和列表语法
  • 语法更接近AST,更容易解析

0
其他选项可能更适合(提到了Clojure),但这里是一个使用Ruby的例子。(JRuby可以编译为JVM)。Ruby的哈希语法足够方便-除非有其他依赖,否则不需要其他格式。请注意,lambda函数中的"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

0

看看PyYAML。它似乎相当完整。

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

优点:

缺点:

  • 静态作用域,而非词法作用域
  • 它是面向对象的,但由于可以在函数式编程中使用,我不确定为什么会对你造成伤害
  • 没有类型推断,但好的IDE将在您编写代码时警告您...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,