schema for clojure
Schema
for Clojure Data Shape
Declaration
and Validation
1.何为schema
schema是描写叙述数据形式的一种clojure数据结构,可用于文件、校验函数和数据。
以下举个样例让大家对schema有个整体认识.
例:
(ns schema-examples
(:require [schema.core :as s]))
(def s-type s/Str)
(s/validate s-type "123") ;; Success!
(s/validate s-type 123) ;; Exception -- Value does not match schema:...
2.schema在clojure中的使用
(1)project.clj的:dependencies中加入“[prismatic/schema
"0.3.1"]”包。
(2)在命名空间的:require中增加“[schema.core :as s]”。
3.定义数据类型
(1)支持java所定义的全部数据类型(包含基本数据类型和复杂数结构),schema封装了好多Java的数据类型,如Int
Str等。
[详见](http://prismatic.github.io/schema/schema.core.html)
例:(def data long)
(def map-shape java.util.Map)
(2)支持schema.core定义的数据类型
例:(def s-data s/Int)
(def s-str s/Str)
(def s-keyword s/Keyword)
(3)支持自己定义数据类型
例:
(def Data
{:a {:b s/Str
:c s/Int}
:d [{:e s/Keyword
:f [s/Num]}]})
(4)能够利用schema提供的工具函数来定义类型
例:
定义一个数据必须是奇数且为长整形的:
(def OddLong (s/both long (s/pred odd? 'odd?
)))
(都不用你再写一个检查函数了,非常方便啊。有木有!!)
(5)对于Map的schema。在定义的时候还能够设定可选项
如:
(def FancyMap
{(s/optional-key :foo) s/Keyword
s/Str s/Str})
(s/validate FancyMap {"a" "b"})
(s/validate FancyMap {:foo :f "c" "d" "e" "f"})
注意:key 和 value应该是成对出现或消失的。
(s/validate
FancyMap {:foo "c" "d" "e" "f"}) ;; Exception -- Value does not match schema:...
(6)你能够用s/validate函数来检測你定义的数据是否满足你定义的类型。
还能够用s/explain函数来检查某个类型的定义。
如:
(s/validate FancyMap {"a" "b"})
(s/explain FancyMap)
4.定义变量
能够用schema.core中的def来定义一个变量, 如:
(s/def foo :- long 2)
要求用于变量初始化的值必须满足定义的schema.
5.定义函数
schema.core中封装了好多函数, 我们能够利用s/defn或s/fn来定义我们的函数,和用clojure的defn是一样样的.
例:
(s/defn deposite :- (s/maybe s/Int)
[order-id :- (s/maybe s/Int) pay-type :- s/Str]
...)
(1)假设想要对函数做类型检查,必须使用schema中封装的defn 或 fn来定义函数。这是运行类型检查的基础。可是是否进行类型检查,还有“开关”进行控制。
(2)參数和返回值:能够用":-"符号来指定一个參数和返回值的类型(能够是自己定义类型)。
(3)假设数据可能为nil时,能够用maybe函数来修饰。
(4)假设想要对某个函数或者多个函数进行类型检查,能够用with-fn-validation来运行这些函数。如:
(s/with-fn-validation
(deposite
1 "yidong")
(function2
...)
(function3
...))
* 这个相当于类型检查的“开关”,在測试代码中很实用。
我们能够在測试的时候开启类型检查。而公布的时候则不须要开启。
(5)假设想要一个函数总是运行类型检查,能够使用“^:always-validate”。如:
(s/defn ^:always-validate finish-order :- Map
[order-id :- s/Int pay-type :- s/Str pay-result :- s/Bool]
*对于那些和用户输入相关的函数,能够使用该方法。
6.schema的优点:
(1)可自己定义数据类型。
(2)可自由控制检測开关。
比方,可在測试时打开类型检測。公布时关闭.
(3)明白输入输出, 提高代码可读性。
不须要为函数參数和返回值写一堆凝视:凝视和代码不同步,自然语言描写叙述的不明白、不一致,在每一个使用该数据的地方都要写一次凝视.
7.schema的不足:
(1)不能对数组的个数做限定,假设想定义仅仅有两个元素的数组"[Long Long]".
个人想法:这不能算是不足。由于schema主要是做类型检測的,不是编译器。
(2)不能定义某些复杂的类型。如想要给以下的数据结构定义一个类型:
[[1 1.0] [2 2.0]]
你可能会定义成:
(def
a [[s/Int double]])
结果执行(s/validate a [[1 1.0] [2 2.0]])出错.
定义成[[s/Num]]则执行正常.
个人想法:数组中存放的元素的类型应该是一致的(C/C++/JAVA等语言中,数组中元素的类型不都是一致的么?),
你能够把它们封装在一个map或者类里。再来定义。
8.schema支持的clojure版本号。
文档上说是1.5.1 and 1.6.x,实际測试发现1.7.0-alpha也支持。
*还支持ClojureScript(有须要的时候再研究,欢迎大家补充).
以上是依据个人实践和查阅资料所总结出来的, 有不足或者错误之处,请大家补充和指正.
版权声明:本文博主原创文章,博客,未经同意不得转载。
schema for clojure的更多相关文章
- clojure with postgres
主要关注访问pg.不关心其他db 1 clojure.java.jdbc https://github.com/clojure/java.jdbc http://clojure-doc.org/art ...
- JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议
软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...
- [MySQL Reference Manual] 23 Performance Schema结构
23 MySQL Performance Schema 23 MySQL Performance Schema 23.1 性能框架快速启动 23.2 性能框架配置 23.2.1 性能框架编译时配置 2 ...
- Referenced file contains errors (http://www.springframework.org/schema...错误
Referenced file contains errors (http://www.springframework.org/schema...错误 Referenced file contains ...
- jBPM4.4 no jBPM DB schema: no JBPM4_EXECUTION table. Run the create.jbpm.schema target first in the install tool.
jBPM4.4 no jBPM DB schema: no JBPM4_EXECUTION table. Run the create.jbpm.schema target first in the ...
- 高性能MySQL(四):schema陷阱
一.schema陷阱 二.缓存表和汇总表 三.范式和反范式
- XmlValidationHelper XSD、Schema(XmlSchemaSet)、XmlReader(XmlValidationSettings)、XmlDocument、XDocument Validate
namespace Test { using Microshaoft; using System; using System.Xml; using System.Xml.Linq; class Pro ...
- solr schema.xml文档节点配置
首先,讲解一下/usr/local/solr/collection1/conf/schema.xml的配置,此文档功能类似于配置索引数据库. Field:类似于数据库字段的属性(此文统一使用用“字段” ...
- clojure基础入门(一)
最近在看storm的源码,就学习分享下clojure语法. 阅读目录: 概述 变量 运算符 流程控制 总结 概述 clojure是一种运行在JVM上的Lisp方言,属于函数式编程范式,它和java可以 ...
随机推荐
- SQL之性能优化
在实际应用中.数据库中的数据会有非常多.若要从这些数据表中检索数据,就须要对系统进行优化,提高数据库系统的响应速度,以下就是日常一些查询优化的方法. 1.创建索引 索引能够提高数据库查询的速度, ...
- 新书《iOS8 Swift编程指南》货架
颐和园的新书出版. 链接:http://www.amazon.cn/dp/B00YOQSYAO 这本书从去年开始7可能开始写.今年1完成这个月的第一稿,经过多次修改,今天,最后的正式出版,欢迎大家指正 ...
- C#里System.Data.SQLite中对GUID的处理
string sqlstring = "select * from endpoint_policy where HEX([UserGuid]) ='" + CommonHelper ...
- MVC模型与FishiGUI应用层MVC型号
MVC概要: MVC (Modal View Controler)M是指数据模型,V是指用户界面,C则是控制器. 使用MVC的目的是将M和V的实现代码分离,从而使同一个程序能够使用不同的表现形式.比方 ...
- 第三届蓝桥杯Java高职组决赛第三题
题目描述: 某少年宫引进了一批机器人小车.可以接受预先输入的指令,按指令行动.小车的基本动作很简单,只有3种:左转(记为L),右转(记为R),向前走若干厘米(直接记数字). 例如,我们可以对小车输入如 ...
- 合作编辑室计费系统(一)-SVN常见错误
联合室已完成,在不到一个月的时间,我们的团队:嗤.陈琛.我.这段时间都挺辛苦的.从心里这次合作,真的让我们学习了非常多,学会了接纳和承担. 在我们開始合作机房的时候,社和师哥就给我们做了功课,说你们好 ...
- arch linux设备(请参考官方文档,桌面安装没有找到一个好工作后)
首先,启动安装系统(一获得通过vmware虚拟机) 1.设置键盘布局 #loadkeys "us" #设置为美国的键盘布局.一般能够默认就可以 2.建立硬盘的分区 我採用的是fdi ...
- BP神经网络的基本原理
2.1 BP神经网络基本原理 BP网络模型处理信息的基本原理是:输入信号Xi通过中间节点(隐层点)作用于输出节点.经过非线形变换,产生输出信号Yk,网络训练的每一个样本包含输入向量X和期望输出量t,网 ...
- 矩形类定义【C++】
Description 定义一个矩形类,数据成员包括左下角和右上角坐标,定义的成员函数包括必要的构造函数.输入坐标的函数,以及计算并输出矩形面积的函数.要求使用提示中给出的测试函数并不得改动. Inp ...
- System.Threading.ThreadStateException
异常:"System.Threading.ThreadStateException"在未处理的异常类型 System.Windows.Forms.dll 发生 其它信息: 在能够调 ...