Functional programming 组织Clojure代码
我有一个在图像上绘制形状的程序。我对每个形状都有一个单独的名称空间,它们位于单独的文件中Functional programming 组织Clojure代码,functional-programming,clojure,Functional Programming,Clojure,我有一个在图像上绘制形状的程序。我对每个形状都有一个单独的名称空间,它们位于单独的文件中 com/name/box.clj-->具有com.name.box命名空间。 com/name/triangle.clj-->具有com.name.triangle命名空间 它们都共享一个名为generate的公共函数,该函数在屏幕上绘制它们,所以如果我使用use,函数名会发生冲突 现在,我用load file加载它们。有更好的方法吗?查看Clojure API,似乎有多种包含文件的方法。对于包含大量文件的
com/name/box.clj-->具有com.name.box命名空间。
com/name/triangle.clj-->具有com.name.triangle命名空间 它们都共享一个名为generate的公共函数,该函数在屏幕上绘制它们,所以如果我使用
use
,函数名会发生冲突
现在,我用
load file
加载它们。有更好的方法吗?查看Clojure API,似乎有多种包含文件的方法。对于包含大量文件的项目,哪一个是更好的选择?我也是从使用加载文件开始的。据报道,
Clojure定义了命名和构造库的约定:
*库名称是一种符号,通常包含两个或多个由句点分隔的部分。
*库的容器是一种Java资源,其类路径相对路径派生自库名称:
o路径是一个字符串
o库名称中的句点替换为路径中的斜杠
o库名称中的连字符替换为路径中的下划线
o路径以“.clj”结束
*lib以“ns”形式开始,该形式为
o创建共享其名称的Clojure命名空间,
o声明其对Java类、Clojure的核心功能和/或其他LIB的依赖关系
Clojure文档进一步提供了以下示例名称空间声明(我相信您已经知道了,但我在这里提供它是为了完整性):
所以,我的答案是在你的项目中使用libs——这将有助于简化所有这些文件夹。要“包含”库,您将使用require,如下所示:
(require 'clojure.contrib.def 'clojure.contrib.except 'clojure.contrib.sql)
(require '(clojure.contrib def except sql))
只要文档是正确的,并且您的项目是类路径相关的,就应该愉快地加载所有内容。希望这能回答你的问题D同时使用名称空间libs(正如已经建议的那样)也许您常用的“generate”函数是多重方法的候选者
这将有助于避免函数名冲突,并为“形状”添加一个公共抽象,我想这取决于是否能找到合适的分派函数
(require 'clojure.contrib.def 'clojure.contrib.except 'clojure.contrib.sql)
(require '(clojure.contrib def except sql))