组织Clojure代码

Ham*_*aya 10 functional-programming clojure

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


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

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

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

Zac*_*ray 9

我也开始使用了load-file.根据关于libsClojure文档,

Clojure定义了命名和构造库的约定:
    *lib名称是一个符号,通常包含两个或多个由句点分隔的部分.
    *lib的容器是一个Java资源,其类路径相对路径是从lib名称派生的:
        o路径是字符串
        o lib名称中的句点被路径中的斜杠替换
        o lib名称中的连字符被下划线替换为路径
        o路径以".clj"结尾
    *lib以"ns"形式开头,用于
        创建共享其名称的Clojure命名空间,并
        声明其对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]))
Run Code Online (Sandbox Code Playgroud)

所以,我的答案是为你的项目使用libs - 它将有助于简化所有这些文件夹.要"包含"lib,你将使用require,如下所示:

(require 'clojure.contrib.def 'clojure.contrib.except 'clojure.contrib.sql)
(require '(clojure.contrib def except sql))
Run Code Online (Sandbox Code Playgroud)

只要文档是正确的并且您的项目是类路径相关的,一切都应该愉快地加载.希望这能回答你的问题.:d


小智 6

如果已经建议使用命名空间库,或许您的常用"生成"函数是多方法的候选者?http://clojure.org/multimethods

这有助于避免函数名称冲突并为你的'形状'添加一个共同的抽象,我想这取决于是否可以找到合适的调度函数.