我有一个在图像上绘制形状的程序。我为每个形状都有一个单独的命名空间,它们位于不同的文件中。
com / name / box.clj - >有com.name.box命名空间。
com / name / triangle.clj - >有com.name.triangle命名空间。
它们共享一个名为generate的通用函数,它在屏幕上绘制它们,所以如果我使用use
,函数名称会发生冲突。
现在,我用load-file
加载它们。有没有更好的方法呢?通过Clojure API,似乎有多种方法可以包含文件。对于包含大量文件的项目,哪一个更好?
答案 0 :(得分:9)
我也开始使用load-file
。根据{{3}},
Clojure定义了命名和构造库的约定:
* lib名称是一个符号,通常包含两个或多个由句点分隔的部分 * lib的容器是Java资源,其类路径相对路径是从lib名称派生的:
o路径是一个字符串
o lib名称中的句点由路径
中的斜杠替换 o lib名称中的连字符由路径
中的下划线替换 o路径以“.clj”结尾 * lib以“ns”形式开头 o创建共享其名称的Clojure命名空间,以及
o声明它依赖于Java类,Clojure的核心工具和/或其他库
Clojure文档进一步提供了以下示例命名空间声明(我相信您已经知道了,但我在此提供完整性):
(ns com.my-company.clojure.examples.my-utils
(:import java.util.Date)
(:use [clojure.contrib.def :only (defvar-)])
(:require [clojure.contrib.shell-out :as shell]))
所以,我的答案是为你的项目使用libs - 它将有助于简化所有这些文件夹。要“包含”lib,你将使用require,如下所示:
(require 'clojure.contrib.def 'clojure.contrib.except 'clojure.contrib.sql)
(require '(clojure.contrib def except sql))
只要文档正确并且您的项目是类路径相关的,一切都应该很高兴加载。希望这能回答你的问题。 :d
答案 1 :(得分:6)
如果已经建议使用命名空间库,或许你的常用'生成'函数是多方法的候选者? http://clojure.org/multimethods
这有助于避免函数名称冲突并为“形状”添加一个通用抽象,我想这取决于是否可以找到合适的调度函数。