morloc 是一种函数式编程语言,其中的函数是从外国语言中导入的,并统一在一个通用类型系统下。编译器生成跨语言组合函数所需的代码,并指导数据验证、类型/格式转换、数据缓存、分布式计算和文件读取/写入等日常任务的自动化。最终目标是将 morloc 开发成一种查询语言,该语言从无限的函数库和函数组合中返回优化的程序。如果您想直接使用代码,请完成安装部分中的步骤,然后转到 demo/01_sequence_analysis 中的项目。该项目正在积极开发中,在 v1.0 发布之前没有稳定性保证。非常欢迎拉取请求、问题报告和私信。 morloc 还依赖于 CPAN 的 JSON::XS perl 模块,可以按如下方式安装:对于 R 支持,您需要从 github 安装 rmorlocinternals 库,在 R 会话中,运行: 最后,如果您正在使用vim,您可以按如下方式安装 morloc 语法高亮:将其粘贴到一个文件中(例如“hello.loc”),然后它可以被其他 morloc 模块导入或直接编译成一个程序,其中每个导出的术语都是一个子命令。
这将生成一个名为“nexus”的文件。 nexus 文件是用户将与之交互的可执行脚本。对于这个简单的例子,它是唯一生成的文件。 import cppbase (fold, map, add, mul)export squareexport sumOfSquaressquare x = mul x xsumOfSquares xs = fold add 0 (map square xs) install 命令从github repo 克隆cppbase repo 到本地目录~/.morloc/lib。 morloc make -o nexus 命令将生成一个名为 nexus 的文件,它是导出函数的可执行接口。 $ ./nexus -h 导出以下命令: square param 1: Num return: Num sumOfSquares param 1: [Num] return: Num fibplot 函数使用 C++ 函数计算斐波那契数,并使用 R 函数绘制它。 R 函数 plotPDF 是一个完全正常的 R 函数,没有额外的样板: morloc 类型系统的第一级基本上是跨语言扩展的 System F。一个给定的函数对于它实现的每种语言都有一个通用类型和一个特殊类型。 map :: (a -> b) -> [a] -> [b]map Cpp :: (a -> b) -> "std::vector<$1>" a -> "std::vector<$1>" bmap Python3 :: (a -> b) -> list a -> list b
一般签名看起来与 Haskell 等价的几乎相同(除了 morloc 通用量化目前是明确的)。 C++ 的列表类型构造函数实际上是“类型构造函数”,因为它们用于创建语法正确的 C++ 类型字符串。例如,如果类型变量 ai 被推断为 int,则在生成的代码中将使用 C++ 类型 std::vector<int>。在 python 类型构造函数列表中也会发生同样的情况,除了这里生成相同的 Python 类型,而不管 a 的类型。 import cppbase (fold, map, add, mul)export squareexport sumOfSquaressquare x = mul x xsumOfSquares xs = fold add 0 (map square xs) 这个例子无法编译,因为没有任何函数被导入或来源,但它可以被类型检查:添加:: Num -> Num -> Numadd Cpp :: double -> double -> doublemul :: Num -> Num -> Nummul Cpp :: double -> double -> doublefold :: (b -> a -> b) - > b -> [a] -> bfold Cpp :: (b -> a -> b) -> b -> "std::vector<$1>" a -> bmap :: (a -> b) -> [a] -> [b]map Cpp :: (a -> b) -> "std::vector<$1>" a -> "std::vector<$1>" bsquare x = mul x xsumOfSquares xs = fold add 0 (map square xs) 类型检查器将程序的每个子表达式与一组类型相关联。 mul 中的特定类型信息足以推断程序中每个其他 C++ 函数的具体类型。 sumOfSquares 的推断 C++ 类型是 mul 的具体类型目前被写成一个二元函数。理想情况下,此函数应接受任何数字(例如,int 和 double)。我打算最终添加这个功能,也许是使用 Haskell 风格的类型类系统。