寻找基于YAML的功能语言

时间:2013-10-14 22:41:32

标签: functional-programming jvm 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为目标,但据我所知,可能会有更接近我需要的东西。有什么建议吗?

4 个答案:

答案 0 :(得分:1)

Clojure是最合适的。

  • 地图和列表的紧凑语法 - 是
  • 纯功能 - 不像Haskell那么纯,但功能足够
  • 词汇范围 - 是
  • No OOP - 这是从头开始代码库时的首选架构
  • 头等功能 - 是
  • 类型推断 - 支持类型提示的动态类型系统
  • 可从AST 进行编译 - Clojure语法几乎是以
  • 开头的AST
  • 可编译为JVM字节码 - 是

由于以下原因,我认为它比Scala更合适:

  • 更多功能性而不是面向对象的风格
  • 地图和列表的更紧凑语法
  • 语法更接近AST并且更容易解析

答案 1 :(得分: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

答案 2 :(得分:0)

结帐PyYAML。看起来相当完整。

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

优点:

  

缺点:

  
      
  • 静态范围,而不是词法范围
  •   
  • 这是OOP,但鉴于你可以在功能上使用它我不知道为什么这会伤害你
  •   
  • 没有类型推断,但是一个好的IDE会在你编码时警告你......
  •   

答案 3 :(得分:0)

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