Metadata

identical? 和 java 中的 == 运算符是一个意思。= 和 java 中的 equal 函数是一个意思。

Metadata在Clojure中可以不改变数据的情况下给数据增加metadata,使用with-meta宏和meta宏

(def stu {:name "Stu" :email "stu@thinkrelevance.com"})
(def serializable-stu (with-meta stu {:serializable true}))

那么取数据的结果如下:

(meta stu)nil
(meta serializable-stu){:serializable true}

可以用 ^ 代替 meta 来完成上面的工作

当我们根据一个老对象创建一个新对象的时候,老对象的metadata就会跟随着来到新对象这里。

metadata 可以用来给一个函数指定参数和返回值类型,这在传统的函数式编程中往往是没有的,这点缺失也往往成为函数式语言不适合调试的明证。很幸运的是Clojure通过metadata提供了类似的能力。

比如下文我们定义了一个函数,这个函数的参数和返回值都是String类型的:

(defn #^{:tag String} shout [#^{:tag String} s] (.toUpperCase s))

由于metadata的tag参数太常用,在Clojure中可以简化为下面这个形式:

(defn #^String shout [#^String s] (.toUpperCase s))

这样,当你用一些不是String的参数来调用shout的时候就会爆出下面的错误:

(shout 1)
java.lang.ClassCastException: \
java.lang.Integer cannot be cast to java.lang.String

如果你觉得这样定义的函数看起来有点怪异,那么便可以把这个metadata的定义放到最后来做,不过与普通的函数定义有区别的地方在于,我们要用括号包裹起函数体:

(defn shout ([s] (.toUpperCase s)) {:tag String})

下面是一个有用的metadata的key列表

:arglists doc函数调用时,参数信息

:doc doc函数调用时候,文档信息

:file 源代码

:line 代码当前行数

:macro 如果当前是宏则为真

:name local name

:ns namespace

:tag 期望的返回值或者参数类型

Metadata的read macro: ^#form 和 with-meta 还是不同的,一个是给编译器增加metadata,一个是给数据加的。

转载于:https://www.cnblogs.com/mmjx/archive/2011/10/18/2216780.html

Clojure的学习笔记(二)相关推荐

  1. qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...

  2. [转载]dorado学习笔记(二)

    原文地址:dorado学习笔记(二)作者:傻掛 ·isFirst, isLast在什么情况下使用?在遍历dataset的时候会用到 ·dorado执行的顺序,首先由jsp发送请求,调用相关的ViewM ...

  3. PyTorch学习笔记(二)——回归

    PyTorch学习笔记(二)--回归 本文主要是用PyTorch来实现一个简单的回归任务. 编辑器:spyder 1.引入相应的包及生成伪数据 import torch import torch.nn ...

  4. tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数

    tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报  分类: tensorflow(4)  目录(?)[+] 本笔记目的 ...

  5. Scapy学习笔记二

    Scapy学习笔记二 Scapy Sniffer的用法: http://blog.csdn.net/qwertyupoiuytr/article/details/54670489 Scapy Snif ...

  6. Ethernet/IP 学习笔记二

    Ethernet/IP 学习笔记二 原文链接:http://wiki.mbalib.com/wiki/Ethernet/IP 1.通信模式 不同于源/目的通信模式,EtherNet/IP 采用生产/消 ...

  7. Java学习笔记二:数据类型

    Java学习笔记二:数据类型 1. 整型:没有小数部分,允许为负数,Java整型分4种:int short long byte 1.1 Int最为常用,一个Int类型变量在内存中占用4个字节,取值范围 ...

  8. 吴恩达《机器学习》学习笔记二——单变量线性回归

    吴恩达<机器学习>学习笔记二--单变量线性回归 一. 模型描述 二. 代价函数 1.代价函数和目标函数的引出 2.代价函数的理解(单变量) 3.代价函数的理解(两个参数) 三. 梯度下降- ...

  9. ASP.NET MVC 2 学习笔记二: 表单的灵活提交

    ASP.NET MVC 2 学习笔记二:  表单的灵活提交 前面说到有做到公司内部的一个请假系统,用的是ASP.NET MVC 2+Entity Framework.虽然EF(Entity Frame ...

  10. amazeui学习笔记二(进阶开发4)--JavaScript规范Rules

    amazeui学习笔记二(进阶开发4)--JavaScript规范Rules 一.总结 1.注释规范总原则: As short as possible(如无必要,勿增注释):尽量提高代码本身的清晰性. ...

最新文章

  1. HTML中GET与POST的区别
  2. 京瓷1110打印自检页_如何修改小票打印机、厨房打印机IP地址
  3. Eclipse常用的高效插件
  4. 【整理总结】Visual Studio 扩展和更新
  5. linux中的软RAID实现,逻辑卷和btrfs文件系统
  6. 请先设置tkk_物联卡apn设置机型大全!!物联卡连不上4G、网速慢?推荐你看这片文...
  7. 剑网三缘起,葱姜蒜也能卖?欺负新玩家被批评,但说明游戏很自由
  8. erp 维护费 要交吗_erp系统每年都要缴费吗
  9. C++中引用符的使用
  10. Apollo进阶课程㉑丨Apollo规划技术详解——Basic Motion Planning and Overview
  11. IT人不可不听的10个职场故事
  12. idea运行报错Parameter ‘name‘ not found. Available parameters are [arg1, arg0, param1, param2]
  13. Pandas的介绍和使用
  14. firefox关于about:config的常用配置
  15. Recovering High Dynamic Range Radiance Maps from Photographs
  16. 参与评选开源软件名单
  17. 操作系统权限提升(十二)之绕过UAC提权-Windows UAC概述
  18. 【目标检测】小目标检测相关
  19. 小程序token有效期_微信小程序token过期时间后重新获取-微信小程序过期恢复步骤-微信小程序怎么找...
  20. 云服务器地域和可用区介绍

热门文章

  1. c调用python第三方库_用 Python ctypes 来调用 C/C++ 编写的第三方库
  2. inavFilter 惯导融合算法
  3. Linux 自学大全,16张思维导图!
  4. 使用verilog实现基于FPGA的TDC设计
  5. linux下用u盘安装xp系统安装教程,全新Linux笔记本电脑用U盘装Win7/XP系统教程
  6. docker 搜寻 包 版本_ubuntu16.04下安装docker容器
  7. modelandview使用过程_深入源码分析SpringMVC执行过程
  8. 如何测试程序是否_软件开发过程中,如何进行自动化测试?Unit Test 和 UI Test
  9. java 更新jlabel_java - 用Java更新绑定的JLabel文本 - 堆栈内存溢出
  10. string转成对象_详解Java I/O流(五),对象序列化