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,似乎有多种方法可以包含文件.对于包含大量文件的项目,哪一个更好?
我也开始使用了load-file.根据关于libs的Clojure文档,
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
这有助于避免函数名称冲突并为你的'形状'添加一个共同的抽象,我想这取决于是否可以找到合适的调度函数.