clojure学习
clojure学习clojure通过reader来读取字符流,根据不同的读形式来产生不同的数据结构。
reader forms
1: 标识符
标识符以非数字字符开始,可是包含数字在内的字符,还有*, +, !-,_和?. /用来分割命名空间,.表示类名修饰引用,标识符中包含.和/被称为被修饰过的, 以“:”开始的符号被保留。
标识符相当于变量,是对一种事务的命名抽象,通过标识符来引用这个对象。
从标识符的源码中可以看到, 标识符实现了IFn和Named接口, 标识符有所属的命名空间(Named), 引用符号是会在TR中寻找标识符的对象。
2: 常量:
字符串 "sss"
数字: 整数,浮点数和有理数
字符: \s eg: (str "ss" \newline)
nil: 表示什么都没有和空值,相当于null和false
布尔值: true false
关键字:像标识符除了(”:"开始, 不包含.和类名) { :name "s", :age 22}
3: 列表:
( a b c ) 常量列表'( 1 2 3)
4: 向量:
[ 1 2 3 ]
5: Map:
{ :s "s" :d 12 :f 3} 或 { :s "s", :d 12, :f 3}
6: 集合
#{ 1 2 3 } #{ :s :d }
宏符号:
宏符号是reader读取forms的快捷方式。宏字符不能用于标识符
1: Quote 引用(')
'form => (quote form)表示引用form, form可以为上面所有的form, 'd , '1 'nil
2: Character字符(\)
产生一个字符常量, \s
3注释 (;)
单行注释
4:Meta 元数据(^)
^form => (meta form) 查看对象的元数据
5: Deref 用引(@)
@form = ( deref form)解引用,取引用的值,相当于'的饭作用
6: Dispatch分派(#)
#“pattern" 正则表达式
#^设置元数据 标识符,列表,向量和字典有元数据, 这个宏符号读取第一个map把他设置都后面的对象上。
#^String x, 表示 #^{:tag String} x, 用来存储类型信息
#’ var-quote
#'x = (var x)表示标识符本身
#()匿名函数 %n参数位置, %&表示剩余参数
#() = (fn (...)) ( #(+ %1 %2) 1 2 )
语法语录 Syntax-quote( `note, ~Unquote, ~@Unquote-splicing)
除了标识符,列表,向量,字典 `s和‘s是相同的
对于标识符,`d 引用目前上下文中的标识符,产生一个修饰标识符, 如果标志没有命名空间并且以'#’结束,它引用一个相同的名字加_再加一个唯一id组
对于列表,向量,字典,`建立一个相应数据结构的模板,在这个模板内,没有修饰的forms就像·递归的应用,但是form的`递归应用能够通过~和~@修饰来消除, ~产生值, ~@产生序列值
页:
[1]