Functional programming 寻找一种基于YAML的函数式语言
我正在寻找一种将数据描述(la YAML或JSON)与基本脚本功能(例如变量、条件表达式、回调函数)相结合的语言。描述列表和映射的层次结构的东西,如YAML,但其中叶值是函数而不是文字数据 到目前为止,我一直在通过在YAML之上添加表达式逻辑来实现这一点。这让我可以在现有解析器的基础上进行构建,但这也会导致非常笨拙的语法,我必须自己实现它的编译器/解释器方面。我认为我没有能力做那件事 另一种方法是采用现有语言的某个子集,这样我就可以构建一个真正的编译器。遗憾的是,我并不精通任何函数式编程语言。我真的不知道从哪里开始 有人能推荐一种具有以下部分或全部属性的函数式语言吗Functional programming 寻找一种基于YAML的函数式语言,functional-programming,jvm,yaml,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为目标,但据我所知,可能有更接近我需要的东西。有什么建议吗?最合适
- 地图和列表的精简语法-是
- 纯粹的功能性-没有哈斯克尔那么纯粹,但功能性足够
- 词汇范围界定-是
- 无OOP-这是从头开始代码库时的首选体系结构
- 一流功能-是
- 类型推断-支持类型提示的动态类型系统
- 可从AST编译-Clojure语法一开始几乎就是AST
- 可编译为JVM字节码-是
- 更多功能,更少面向对象的风格
- 更紧凑的映射和列表语法
- 语法更接近AST,更容易解析
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中描述的通用工作流语言,用于构造计算图