`
xiuzhuchenqing
  • 浏览: 16139 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Clojure中的元数据Metadata

 
阅读更多

本文参考自http://java.ociweb.com/mark/clojure/article.html#Metadata

也许你在别的计算机语言中见过元数据这一概念,但Clojure中的元数据,也即Metadata有其独有的含义。Clojure里面的Metadata是附加到一个符号或者集合上的一些数据,它们和符号或者集合的逻辑数据没有直接的关系。两个逻辑上一样的方法可以有不同的元数据。比如两张扑克牌都是梅花KMetadata是用于指示那张牌是横向着的,事实上对于大多数扑克牌游戏,扑克牌的倾斜与否对扑克牌所表示数值根本没有影响。如下图所示:

 

 

	(defstruct card-struct :rank :suit)
 

(def card1 (struct card-struct :king :club))

(def card2 (struct card-struct :king :club))
 

(println (== card1 card2)) ; same identity? -> false

(println (= card1 card2)) ; same value? -> true
 

(def card2 #^{:bent true} card2) ; adds metadata at read-time

(def card2 (with-meta card2 {:bent true})) ; adds metadata at run-time

(println (meta card1)) ; -> nil

(println (meta card2)) ; -> {:bent true}

(println (= card1 card2)) ; still same value despite metadata diff. -> true
 

 

clojure中有些元数据有特定的用途。:private有一个boolean值,用于指示在定义某个Var对象的Namespace中是否

访问受限。:doc则是一个Var对象的文档字符串。:test则有一个用于指示一个不接受外部参数的函数是否为一个测试函

数。:tag是一个String类型的类名或者一个Class 对象,表示一个VarJava里面对应的类型,抑或是一个函数的返回类

型。这些都是被作为类型提示。提供这些元数据能够提高性能。

如果你想查看你的clojure代码里面哪里使用反射来决定类型信息 -- 也就是说这里可能会有性能的问题, 那么你可以设置

全局变量*warn-on-reflection* true

Clojure编译器会自动将某些元素附加到Var对象上。

:file是定义Var对象的那个文件的字符串名称。:line则是文件中定义Var对象所在的行数。:name是给Var对象提供名称的一

Symbol。:ns是一个Namespace对象,描述了定义Var对象的Namespace。:macro则是一个指示Var对象是一个宏而非函

数或者绑定变量。:arglist是一序列向量,每个向量都描述了一个函数所能够接受的参数名称。记住,一个函数可以有多个参

数列表和函数体。函数或者宏都是由一个Var对象来表示,有各自相关联的元数据。

 

例如在REPL环境中输入 (meta (var reverse)),输出内容将如下所述,只是都在同一行而已:

 

{
  :ns #<Namespace clojure.core>,
  :name reverse,
  :file "core.clj",
  :line 630,
  :arglists ([coll]),
  :doc "Returns a seq of the items in coll in reverse order. Not lazy."
}
 

 

clojure.repl库中的source函数使用这些元数据获得一个给定函数或者宏的源码。在REPL环境中输入
(source reverse)将产生如下输出:
(defn reverse
  "Returns a seq of the items in coll in reverse order. Not lazy."
  [coll]
    (reduce conj nil coll))
 

 

 

分享到:
评论

相关推荐

    [Clojure] Clojure 数据分析 经典实例 (英文版)

    [Packt Publishing] Clojure 数据分析 经典实例 (英文版) [Packt Publishing] Clojure Data Analysis Cookbook (E-Book) ☆ 出版信息:☆ [作者信息] Eric Rochester [出版机构] Packt Publishing [出版日期] ...

    Clojure脚本:数据处理的函数式利器

    本文将探讨Clojure脚本在数据处理中的应用,包括数据清洗、统计分析、机器学习以及数据可视化等方面,并通过代码示例展示其实际应用。 Clojure运行在Java虚拟机上,因此它能够利用Java的丰富生态系统。Clojure的语法...

    Practical Clojure.pdf

    在Clojure中,数据结构默认是不可变的,这意味着一旦创建了数据结构,就无法更改。这一特性极大地简化了程序的复杂性,并有助于防止并发环境中的许多常见错误。 惰性数据结构是Clojure的另一个重要特性,它允许...

    Clojure Data Analysis Cookbook

    ### Clojure 数据分析实战指南 #### 一、书籍概述与背景 《Clojure 数据分析实战指南》是一本针对数据分析师和技术开发人员的...通过本书的学习,你将能够更好地理解和应用 Clojure 在复杂数据处理任务中的强大功能。

    Clojure入门教程- Clojure – Functional Programming for the JVM中文版

    - **不可变数据**: 在Clojure中,数据一旦创建就无法修改,这对于并发编程尤为重要,因为它消除了锁的需求。 #### 五、Clojure与并发编程 - **并发支持**: Clojure提供了一套强大的工具和技术来处理并发编程,如...

    Clojure编程乐趣]+clojure_programming.pdf

    在“Clojure编程乐趣”这本书中,你将学习到如何使用Clojure进行函数式编程,如何利用Clojure的强大工具处理数据,以及如何构建并发和分布式系统。此外,书中可能还会介绍Clojure社区的一些最佳实践和常用库,例如...

    Programming Clojure 英文电子版

    - **Lisp Reloaded**:尽管Clojure保留了Lisp的一些核心理念,如宏定义和对元编程的支持,但它也摒弃了一些过时的概念。例如,Clojure使用括号来表示函数调用和数据结构,同时保持了良好的可读性。 - **Functional ...

    programming-clojure-3rd

    此外,书中的章节还会涵盖Clojure的数据结构,如向量、列表、映射和集合,它们都是不可变的。不可变性意味着一旦创建,数据结构就无法改变,从而简化了并发编程。Clojure的`transients`机制则为高效更新不可变数据...

    clojure电子书

    这本书涵盖了Clojure的基础语法、数据结构、控制流、函数式编程概念以及如何利用Clojure进行系统设计。此外,书中还深入探讨了Clojure的高级特性,如宏、动态绑定以及与Java平台的集成。中文版的《Clojure编程》则为...

    在 Clojure中实现遗传算法的框架_Clojure_代码_下载

    在Clojure中实现遗传算法的框架是一个有趣且富有挑战性的任务,因为Clojure是一种功能编程语言,它提供了独特的视角和工具来处理这类问题。遗传算法(Genetic Algorithms, GA)是一种模拟自然选择和遗传学原理的优化...

    Python-HoneySQL将Clojure数据结构转换为SQL

    在实际项目中,你可以根据Clojure数据结构构建的查询对象,与Python的数据库API结合,将查询转换为字符串,再执行数据库操作。例如,如果你使用的是psycopg2,可以这样做: ```python import psycopg2 connection =...

    clojure1.3.0及资料

    它全面介绍了Clojure的基础知识,包括数据结构、控制流、函数式编程概念、元编程以及与Java的交互。"Programming Clojure_modify.pdf"可能是这本书的一个修改版或更新版本,可能包含了作者的修订或者社区的贡献。 2...

    Clojure入门教程.pdf

    - **元数据**:为数据添加额外的信息,可用于文档、注解等场景。 - **结构映射(Struct Maps)**:一种特殊类型的映射,用于创建具有固定结构的对象。 - **事务内存(STM)**:Clojure提供了一种基于软件事务的并发模型...

    component, 在Clojure中,有状态对象的托管生命周期.zip

    component, 在Clojure中,有状态对象的托管生命周期 组件'组件'是一个用于管理具有运行时状态的软件组件的生命周期和依赖性的微小Clojure框架。这主要是一个带有几个 helper 函数的设计 Pattern 。 它可以被看作是...

    linux-用于Kubernetes操作的Clojure工具

    1. **部署应用**:通过定义Clojure数据结构来描述应用的容器化配置,如Pod、Deployment、Service等,然后使用Keenest-Rube将这些配置转化为Kubernetes资源对象并部署到集群。 2. **动态扩展**:根据业务需求,可以...

    Clojure调用Java类的一个实例

    对于Java集合,Clojure提供了映射(maps)和序列(sequences)等数据结构,可以方便地转换为Java的ArrayList、HashMap等。例如: ```clojure (let [clojure-list '(1 2 3) java-list (into-array Integer/TYPE ...

Global site tag (gtag.js) - Google Analytics