一个缺乏语义元素组织管理框架的编程语言会显得杂乱无章,并且会导致各种莫名的问题,当然而今这样的语言似乎很难生存。
Clojure也有自己的命名空间,不同于Java等其他语言的是,clojure在逻辑上的组织并非由目录的自然组织方式决定(大多数时候人们还是习惯这么做的,比较直观)。Java将方法组织在一个类中,而类又被组织在包中。Clojure则将包括Vars、Refs、Atoms、Agents、functions、mocros、甚至namespace自己都组织到以symbols命名的namespace中。
Symbols被用于给函数、宏和绑定变量分配名称。Symbols被划分到namespace中。当前总有一个默认的namespace,初步设置在”user”中,并且这个值是保存在全局变量*ns*中的。有两种方式可以改变默认的namespace。in-ns仅仅是改变它,而ns宏除了改变它还会将 clojure.core namespace中的所有symbols在新的namespace中设为可用状态(通过refer)。有关ns的宏的更多特性随后进行阐述。
user名称空间,可以访问clojure.core名称空间中所有的符号。同样通过使用ns宏所声明的任何名称空间也能够访问clojure.core名称空间中所有的符号。
要访问元素如果不在默认的名称空间中,那么这些元素必须加上namespace限定符。只需在namespace名称后加上一个斜杠再加上name就可以。例如clojure.string库中定义了join函数。它可以将一个序列中的所有项的字符串表示形式加上一个给定的分隔符连接成一个字符串。该函数的namespace限定符(namespace-qualified)为clojure.string/join。
函数require用于载入Clojure库。它接受一到多个namespace的引用名称。例如:
(require 'clojure.string)
(require namespace-qualified)只会载入这个类库。这里面的名字还必须是一个全限定的包名, 包名之间用.分割。注意,clojure里面名字空间和方法名之间的分隔符是/而不是java里面使用的. 。例如:
(clojure.string/join "$" [1 2 3]) ; -> "1$2$3"
alias
函数给一个名字空间指定一个别名以减少我们打字工作。当然这个别名的定义只在当前的名字空间里面有效。例如:
(alias 'su 'clojure.string)
(su/join "$" [1 2 3]) ; -> "1$2$3"
refer
函数使得指定的名字空间里面的所有symbols在当前名字空间里面可以访问(不用使用全限定名字)如果当前名字空间有那个名字空间一样的名字,会抛出一个异常。通过指定名字空间的可以解决这一问题。 例如:
(refer 'clojure.string)
这时之前得代码可以写成如下形式:
(join "$" [1 2 3]) ; -> "1$2$3"
require和refer经常被联合使用,因此有了其便捷版本use,如下所示:
(use 'clojure.string)
之前提到过的ns宏可以改变默认的namespace。比较典型的用法是至于一个clojure源文件的头部。它支持:require\:use\:import(用于引入java类),用于替代他们所代指的函数形式。注意下面的示例中,:as是用于创建一个namespace的别名。:only则用于仅载入一个Clojure库的某部分。
(ns com.ociweb.demo
(:require [clojure.string :as su])
; assumes this dependency: [org.clojure/math.numeric-tower "0.0.1"]
(:use [clojure.math.numeric-tower :only (gcd, sqrt)])
(:import (java.text NumberFormat) (javax.swing JFrame JLabel)))
(println (su/join "$" [1 2 3])) ; -> 1$2$3
(println (gcd 27 72)) ; -> 9
(println (sqrt 5)) ; -> 2.23606797749979
(println (.format (NumberFormat/getInstance) Math/PI)) ; -> 3.142
; See the screenshot that follows this code.
(doto (JFrame. "Hello")
(.add (JLabel. "Hello, World!"))
(.pack)
(.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
(.setVisible true))
(def foo 1)
(create-ns 'com.ociweb.demo)
(intern 'com.ociweb.demo 'foo 2)
(println (+ foo com.ociweb.demo/foo)) ; -> 3
ns-interns 'clojure.math.numeric-tower)
all-ns函数返回当前载入的namespace序列。当一个clojure程序在运行时,默认载入了以下namespace:clojure.core, clojure.main, clojure.set,clojure.xml, clojure.zip and user。
分享到:
相关推荐
仅在命名空间加载在 Clojure 中进行事务处理时才需要此库。 安装 将以下内容添加到 project.clj 中的依赖项向量: [txload " 0.1.1 " ] 最新: 用法 在执行需要从不同线程动态加载 Clojure 命名空间的代码之前,...
Clojure库设计用于在OSGI容器中运行时导入和导出clojure名称空间。 汇编 lein javac lein uberjar 将生成的* -standalone.jar放入OSGI自动加载(bundles /)文件夹中 用法 支持以下非标准OSGI Manfiest标头 ...
ns-重新加载用于正确重新加载命名空间的 Clojure 库。安装将[[com.palletops/ns-reload "0.1.0"]]到您的:plugins中的:user配置profiles.clj 。用法( require '[com.palletops.ns-reload :refer :as deps]) 重新加载...
#lang clojure 该项目是Racket中Clojure兼容语言的存根。 它的主要目的是让我练习编写宏和使用Racket的语言扩展工具。... 使用模块/命名空间模拟Clojure命名空间模拟Clojure宏模拟Clojure协议clojure/*下的更多兼容性
支持 SPARQL 查询sparql-prefixes-for prepend-prefix-declarations 公共链接数据命名空间用_ont-app.vocabulary.core 导入使用 ont-app.vocabulary.wikidata 导入导入了ont-app.vocabulary.linguistics 语言标记...
让我们从需要必要的命名空间开始。 ( require '[clojure.test.check :refer [quick-check]] '[clojure.test.check.generators :as gen] '[states.core :refer [run-commands]]) 我们要在测试集上调用的命令必须使用...
namespacefy:用于命名空间关键字的Clojure(Script)帮助器库
类型记录 一个Clojure库,为clojure.tools.logging库提供core.typed批注。 用法 只需将注释添加到执行日志记录的模块中... 但是,clojure.tools.logging命名空间提供了其他扩展该接口的宏,并且众所周知,这些宏不会
掌舵人 基于和Emacs 包旨在探索 Clojure 的项目环境。...helm-clojure 足够聪明,可以插入关于当前命名空间的引用。 如果 var 或 var 的命名空间一般已经被引用到命名空间,则将在没有命名空间的情况下插入; 如
例外 一个简单的Clojure库,该库允许在Clojure中动态定义Java Exception类。 动机 有时,您只需要可以直接捕获的快速Exception类。 defexception使用Java... 这也将import类到当前的命名空间,并创建一个辅助功能fo
这样的哇 ...如果需要,请复制源,执行常规的(:require [such.types :as wow]) ,或创建您自己的commons.clojure.core命名空间,其中包含您认为应该与Clojure打包在一起的所有内容。 文件和commons.cloj
zetta-parser 提供了几个命名空间,每个命名空间都有特定的功能: zetta.core包含开始使用 zetta 解析器的基本功能,例如解析器运行器、解析器的 monadic 实现等。 zetta.parser.seq包含您可能会找到的最基本的...
非ISO货币(例如crypto/ETH )的命名空间标识符。偷窥它显示有关货币的信息: ( require '[io.randomseed.bankster.currency :as currency])TBD 和更多…安装要在您的项目中使用Bankster,请将以下内容添加到...
React堆 使用 Clojure 进行React式编程的工具。 此处实现的工厂和组合器的目的是使用->>宏和熟悉的函数(如filter 、 map或merge支持事件流和... 或将其放入命名空间声明中,如下所示: ( ns my.own.namespace ( :r
有状态的到目前为止,这只是带有*rand*动态four.stateful和rand 、 rand-int 、 rand-nth和shuffle等价物的four.stateful命名空间。获得[com.gfredericks/four "0.2.0"] 用法( require '[four.stateless :as rnd])( ...
邮编II 该库实现了由GérardHuet发表在。 它还提供了与原始Clojure实现高度兼容的命名空间( com.hapgood.zipii )。目标按照粗略的优先顺序,... 在com.hapgood.zipii命名空间中提供clojure.zip兼容模式。 执行良好的
clj-osf clj-osf是一种简单的 Clojure 域特定语言 (DSL),用于查询开放语义框架 (OSF) Web 服务端点。... 开发人员必须: 在他们的项目中使用 clj-osf 包声明他们想要使用的命名空间通过调用 defosf 和
深度Clojure / Python集成版本信息BETA版本很... -生成可封装python模块的clojure命名空间,这些命名空间可安全地与AOT一起使用,并且加载速度比类似的require-python调用快得多。 这些名称空间不会自动初始化python
4Clojure解决方案 Zenius 尝试解决 4clojure.com 的问题,利用 jayfields 的期望使工作流程...在您的文件夹中创建一个文件并根据规则对其进行命名空间 将 4clojure 测试用例复制粘贴到文件中 将“__”替换为您为该特定
它以创建名为的命名空间的想法命名. 使用dev实用程序,可以从任何地方使用./foo语法访问它们,而无需任何操作。 注意 [com.gfredericks/dot-slash-2 "0.1.5"] 用法 生的 基本的 ( require '...