Functional programming 寻找一种基于YAML的函数式语言

Functional programming 寻找一种基于YAML的函数式语言,functional-programming,jvm,yaml,Functional Programming,Jvm,Yaml,我正在寻找一种将数据描述(la YAML或JSON)与基本脚本功能(例如变量、条件表达式、回调函数)相结合的语言。描述列表和映射的层次结构的东西,如YAML,但其中叶值是函数而不是文字数据 到目前为止,我一直在通过在YAML之上添加表达式逻辑来实现这一点。这让我可以在现有解析器的基础上进行构建,但这也会导致非常笨拙的语法,我必须自己实现它的编译器/解释器方面。我认为我没有能力做那件事 另一种方法是采用现有语言的某个子集,这样我就可以构建一个真正的编译器。遗憾的是,我并不精通任何函数式编程语言。我

我正在寻找一种将数据描述(la 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为目标,但据我所知,可能有更接近我需要的东西。有什么建议吗?

最合适

  • 地图和列表的精简语法-是
  • 纯粹的功能性-没有哈斯克尔那么纯粹,但功能性足够
  • 词汇范围界定-是
  • 无OOP-这是从头开始代码库时的首选体系结构
  • 一流功能-是
  • 类型推断-支持类型提示的动态类型系统
  • 可从AST编译-Clojure语法一开始几乎就是AST
  • 可编译为JVM字节码-是
我认为它比Scala更合适,原因如下:

  • 更多功能,更少面向对象的风格
  • 更紧凑的映射和列表语法
  • 语法更接近AST,更容易解析

其他选项可能更适合(提到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
退房。它似乎相当完整

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

优点:

  • 非常棒的YAML支持分层列表的紧凑语法等
  • Python可以以“几乎纯粹”的功能方式使用
  • 具有一流的功能
  • 是可以从AST编译的,我想
  • 可使用Jython编译为JVM字节码
缺点:

  • 静态范围,而非词汇范围
  • 这是面向对象的,但考虑到你可以在功能上使用它,我不知道为什么这会伤害你
  • 没有类型推断,但是一个好的IDE会在您编写代码时警告您

这是一个有趣的用例。它听起来有点像YAML中描述的通用工作流语言,用于构造计算图