我正在寻找一种将数据描述(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为目标,但据我所知,可能会有更接近我需要的东西。有什么建议吗?
答案 0 :(得分:1)
Clojure是最合适的。
由于以下原因,我认为它比Scala更合适:
答案 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并不能满足您的所有要求,尽管它确实满足了一些要求。所以对你:
优点:
- 非常棒的YAML支持分层列表的紧凑语法等。
- Python可以以“几乎纯粹”的功能方式使用; see Python's docs here
- 拥有一流的功能
- 可以从AST编辑,我认为 ... see Python's docs here
- 可以使用Jython see the Jython docs here
编译JVM字节码
缺点:
- 静态范围,而不是词法范围
- 这是OOP,但鉴于你可以在功能上使用它我不知道为什么这会伤害你
- 没有类型推断,但是一个好的IDE会在你编码时警告你......
答案 3 :(得分:0)
这是一个有趣的用例。听起来有点像YAML中描述的通用工作流语言,用于构建计算图