英文原文地址:http://clojure-doc.org/articles/tutorials/introduction.html
转载请注明翻者(Dead_Micky)和出处
本菜鸟英语水平差,欢迎各位大神的批评指导。
标识符
标识符用于表示给clojure中的变量等事物命名的,例如
(defthe-answer42)
我们给一个变量命名为the-answer,其数值是42。
在本文档中我们将使用小写字母,数字和破折号。当然clojure的标识符也支持其他的字符,例如:_<>!?*
(示例this->that
, ready?
)
标量(Scalars)
Clojure现在已经支持如下的标量了:
nil
true,
false
nil是空值,类似于python的None或者java的null。此外,在clojure但中不存在“undefined”既未定义的标量(如果你试图去使用一个未定义的符号的时候,编译器会告诉你你在使用未定义的符号)。
输入以下表达式到你的REPL当中看看他们的结果吧。
1 ; integer 1N ; arbitrary-precision integer 1.2 ; float/double/decimal 1.2M ; arbitrary-precision decimal 1.2e4 ; scientific notation 1.2e4M ; sci notation of arbitrary-precision decimal 0x3a ; hex literal (58 in decimal) 1/3 ; Rational number, or "ratio". \a ; The character "a". "hi" ; A string.
一个字符串可以换行输入,回车之后继续输入以双引号开始双引号结束。如果你需要在字符串中包含一个双引号的话需要用转义符号“\”,这与java语言类似。
#"^foo\d?$"
; A regular expression.
:foo
; A keyword.
我们将会在后续内容中讨论正则表达式。regular expressions
关键字就是一种自我运算的标量,在其他语言他的标识符可能是一个字符串(例如哈希表中的索引键)
Keywords are just scalars that evaluate tothemselves and are useful where in other languages you might use little stringsas identifiers (for example, as the keys in a hashmap).
我们将会在下一节(数据结构)中介绍关键字的更多内容
'foo
; A symbol.
一个符号(symbol)是代表着某件事物名字的对象(译注:是否可以理解为变量名?)。单引号是为了让clojure不去试图找出这个符号所关联的东西(单引号不是标识符的一部分)。当你想要表述一件事物的名称的时候,而不是需要表达他的数值时你可以使用symbol。在我们介绍了宏之后你会对他的功能有一个更为清楚的了解。
术语:上文中所提到的“对象”是clojure用于代表一个值的对象,并不是面向对象编程中的对象。Clojure并不是一种面向对象语言。当然了,你是可以通过clojure调用java中的opp对象的,但是这并不在本教程的范畴。
此外,文中的“引用(reference/refer)”也是一般意义上所说的引用。一个symbol是一个对象的引用,且自己并不是一个对象。Clojure支持一种叫做引用类型的类型,我们将在后续章节(引用类型)中介绍。
数据结构
Clojure来自一个含有简洁的语法和和种各样的核心数据结构盒子(译注:各种各样的括号)
[1 2 3] ; A vector (can access items by index).
[1 :two "three"] ; Put anything into them you like.
{:a 1 :b 2} ; A hashmap (or just "map", for short).
哈希表是你常用的一种哈希/索引的数据结构。在上述示例中,索引键是:a和b,并且他们的值分别为1和2.一个键值对(key-value pair)在一个表中称作条目(entry)。尽管这是哈希表键值的常规使用方法,但是你可以使用任何你喜欢的值去作为键(key)或者是值(value)
#{:a :b :c} ; 集合 (无序,不重复).
'(1 2 3) ; 列表 (链表)
你应当尽量避免使用列表去存储某些连续的数据。
(def my-stuff '("shirt" "coat" "hat")) ; 能用, 但是 ...
(def my-stuff ["shirt" "coat" "hat"]) ;更常见的实现方法.
列表常用于处理代码自身,此时将代码视为一堆嵌套列表(译注:应该是广义表)---详见宏Macros.
此外,在列表的括号前的单引号是高速clojure这不是一个函数调用(后面将进行讨论),而是一个列表。
注:在clojure中,我们使用“向量(vector)”而不是“数组(array)”。“数组(array)”将用于表示java原生的array,所以使用“向量(vector)”表示clojure自己的数据结构。
如你所愿,clojure允许数据结构的嵌套:
#{:a
[1 2 3]
{:foo 11 :bar 12}
#{"shirt" "coat" "hat"}}
稍后我们就将介绍如何从嵌套数据结构中获取数值。
-抽象数据结构(Abstractions)
刚刚提到的数据结构(列表,向量,哈希表,集合)都是具体数据类型(concrete data types)。着用于这些数据结构的方法实际上在编写的时候并不是作用于具体数据结构的,而是作用于抽象数据结构。一些clojure的抽象数据结构如下所示:
- Collection-组合抽象结构(列表,向量,哈希表和集合都是 collections.)
- Sequential (列表和向量为有序的collections时)
- Associative-关联抽象结构 (哈希表关键字与值关联,向量的下表与值关联)
- Indexed-索引抽象结构 (向量,向量可以以下标索引的方式进行操作)
本文档中的各种各样的函数,它们都使用,例如“coll”表示该函数作用于任何类型的collection。如果你想知道对象的类型是什么的话可以使用 例:(type my-stuff)查看。