學(xué)習(xí)clojure第七天

創(chuàng)建數(shù)據(jù)結(jié)構(gòu)

創(chuàng)建方法如下:

(list 1 2 3)            ; ? '(1 2 3)
(vector 1 2 3)          ; ? [1 2 3]
(hash-map :a 1 :b 2)    ; ? {:a 1 :b 2}
(hash-set :a :b :c)     ; ? #{:a :b :c}

數(shù)據(jù)結(jié)構(gòu)在vector锚沸,map和set的互轉(zhuǎn)

(def my-vec [1 2 3])
(set my-vec)                   ; ? #{1 2 3}

(def my-map {:a 1 :b 2})
(vec my-map)                   ; ? [[:a 1] [:b 2]]
(flatten (vec my-map))         ; ? (:a 1 :b 2)
(set my-map)                   ; ? #{[:b 2] [:a 1]}

(def my-set #{:a :b :c :d})
(vec my-set)                   ; ? [:a :c :b :d]

;; And for fun:
(zipmap [:a :b :c] [1 2 3])    ; ? {:c 3 :b 2 :a 1}
(apply hash-map [:a 1 :b 2])   ; ? {:a 1 :b 2}

這里有一個(gè)簡(jiǎn)寫的列表

literal  long name  short name
-------  ---------  ------------------
()       list       *{no short name}*
[]       vector     vec
{}       hash-map   *{no short name}*
#{}      hash-set   set

怎么使用數(shù)據(jù)結(jié)構(gòu)

;; Vectors
(def v [:a :b :c])
(nth v 1)             ; ? :b
(v 1)                 ; ? :b  (same)
(first v)             ; ? :a
(rest v)              ; ? (:b :c)
(next v)              ; ? (:b :c)
(last v)              ; ? :c

;; Lists
;; Same as vectors, but can't index.

;; Maps
(def m {:a 1 :b 2})
(get m :a)            ; ? 1
(m :a)                ; ? 1       (same)
(:a m)                ; ? 1       (same!)
(get m :x 44)         ; ? 44      (if no :x, 44 is the default)
(keys m)              ; ? (:a :b)
(vals m)              ; ? (1 2)
;; Grab a key or a val from a single map entry:
(key (first m))       ; ? :a
(val (first m))       ; ? 1
;; Of course, note that maps are not ordered.

;; Sets
(def s #{:a :b :c})
(s :a)                ; ? :a
(s :z)                ; ? nil

需要注意是clojure的數(shù)據(jù)結(jié)構(gòu)是不可改變的,如果對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行操作,那么它會(huì)復(fù)制一份新的。

請(qǐng)看如下操作:

;; Vectors
(def v   [:a :b :c])
(def li '(:a :b :c))
(conj v  :d)          ; ? [:a :b :c :d]
(conj li :d)          ; ? (:d :a :b :c)

v   ; ? is still [:a :b :c]
li  ; ? is still (:a :b :c)

;; Maps
(def m {:a 1 :b 2})
(assoc m :c 3)        ; ? {:a 1 :c 3 :b 2}
(dissoc m :b)         ; ? {:a 1}

m   ; ? is still {:a 1 :b 2}

;; Sets
(def s #{:a :b})
(conj s :c)           ; ? #{:a :c :b}
(disj s :a)           ; ? #{:b}

s   ; ? is still #{:a :b}

String的操作

我們之前講過(guò)clojure的namespaces,這里使用require進(jìn)行引入

(str "hi" "there")
;; ? "hithere"
(count "hello")
;; ? 5
(require '[clojure.string :as str])
;; ? nil
(str/split "hello there" #" ")
;; ? ["hello" "there"]
(str/join ["hello" "there"])
;; ? "hellothere"
(str/join " " ["hello" "there"])
;; ? "hello there"
(str/replace "hello there" "ll" "LL")
;; ? "heLLo there"

還有一些操作

(first "hello")
;; ? \h
(last "hello")
;; ? \o
(rest "hello")
;; ? (\e \l \l \o)
(nth "hello" 1)
;; ? \e
(doseq [letter "hello"] (println letter))
;; h
;; e
;; l
;; l
;; o
;; ? nil

值,不變性和持久化(Values, Immutability, and Persistence)

一個(gè)value就是一個(gè)常量污桦,在clojure中,所有的scalars和data structure都是這樣的匙监,不可被改變凡橱,沒(méi)有"遠(yuǎn)處的改變",你可以放心的使用一個(gè)數(shù)據(jù)亭姥,因?yàn)椴挥脫?dān)心這個(gè)數(shù)據(jù)被改變稼钩。如下:
``
(def a [1 2 3 4 5])
(def b a)
;; Do what you will with b, ...
(my-func a) ; but it won't affect a.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市达罗,隨后出現(xiàn)的幾起案子坝撑,更是在濱河造成了極大的恐慌,老刑警劉巖粮揉,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巡李,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡扶认,警方通過(guò)查閱死者的電腦和手機(jī)侨拦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蝠引,“玉大人阳谍,你說(shuō)我怎么就攤上這事蛀柴◇Ω牛” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵鸽疾,是天一觀的道長(zhǎng)吊洼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)制肮,這世上最難降的妖魔是什么冒窍? 我笑而不...
    開(kāi)封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任递沪,我火速辦了婚禮,結(jié)果婚禮上综液,老公的妹妹穿的比我還像新娘款慨。我一直安慰自己,他們只是感情好谬莹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布檩奠。 她就那樣靜靜地躺著,像睡著了一般附帽。 火紅的嫁衣襯著肌膚如雪埠戳。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天蕉扮,我揣著相機(jī)與錄音整胃,去河邊找鬼。 笑死喳钟,一個(gè)胖子當(dāng)著我的面吹牛屁使,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播荚藻,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼屋灌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了应狱?” 一聲冷哼從身側(cè)響起共郭,我...
    開(kāi)封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎疾呻,沒(méi)想到半個(gè)月后除嘹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岸蜗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年尉咕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片璃岳。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡年缎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铃慷,到底是詐尸還是另有隱情单芜,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布犁柜,位于F島的核電站洲鸠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜扒腕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一绢淀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瘾腰,春花似錦皆的、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至怪嫌,卻和暖如春义锥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背岩灭。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工拌倍, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人噪径。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓柱恤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親找爱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子梗顺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容