【问题标题】:Looking for a functional language based on YAML寻找基于 YAML 的函数式语言
【发布时间】:2013-10-14 22:41:32
【问题描述】:

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

【问题讨论】:

    标签: functional-programming jvm yaml


    【解决方案1】:

    Clojure 是最合适的。

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

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

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

    【讨论】:

      【解决方案2】:

      其他选项可能更适合(提到了 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
      

      【讨论】:

        【解决方案3】:

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

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

        优点:

        缺点:

        • 静态作用域,非词法作用域
        • 它是 OOP,但鉴于您可以在功能上使用它,我不知道为什么这会伤害您
        • 没有类型推断,但好的 IDE 会在您编写代码时发出警告...

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-01-02
            • 2011-04-03
            • 2011-11-25
            • 1970-01-01
            • 1970-01-01
            • 2010-11-12
            • 1970-01-01
            • 2018-06-25
            相关资源
            最近更新 更多