组织Clojure代码

时间:2009-07-16 02:39:53

标签: functional-programming clojure

我有一个在图像上绘制形状的程序。我为每个形状都有一个单独的命名空间,它们位于不同的文件中。


com / name / box.clj - >有com.name.box命名空间。
com / name / triangle.clj - >有com.name.triangle命名空间。

它们共享一个名为generate的通用函数,它在屏幕上绘制它们,所以如果我使用use,函数名称会发生​​冲突。

现在,我用load-file加载它们。有没有更好的方法呢?通过Clojure API,似乎有多种方法可以包含文件。对于包含大量文件的项目,哪一个更好?

2 个答案:

答案 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

这有助于避免函数名称冲突并为“形状”添加一个通用抽象,我想这取决于是否可以找到合适的调度函数。