≡ Menu

Clojure: Collections vs Sequences

clojure-logo

Clojure adalah bahasa pemrograman yang memakai gaya LISP, salah satu keunggulan Clojure selain LISP adalah struktur data yang dimiliki, yaitu Collections dan Sequences. Saat bekerja dengan Clojure, banyak ekpresi dibentuk berdasarkan struktur data dari Collections dan Sequences.

Collecions


Collectioins
pada Clojure bersifat immutable, arinya tidak bisa dirubah saat data tersebut sudah terbentuk. Kerena itu, cara merubah Collections adalah dengan mentransfernya ke dalam ekpresi yang baru.

Collections yang sering saya pakai di Clojure biasanya: vectors, lists, maps, dan sets.

Vectors

Vector adalah tipe data dalam Clojure yang pengaksesan element--nya menggunakan indeks. Posisi dalam vector penting, meskipun element sama, tetapi jika posisinya berbeda, maka akan menghasilkan vector yang berbeda.

Cara membentuk vector adalah memakai kurung siku [element] atau (vector element).

(vector 1 2 3 4 5) 
;; => [1 2 3 4 5]
 
([1 2 3 4 5])
;; => [1 2 3 4 5]
 
(= [1 2 3 4 5] [5 4 3 2 1])
;; => false

Lists

List merupakan tipe data yang selain Collections juga termasuk Sequences. List pada Clojure adalah single link list, pembacaan dilakukan secara sequential dari awal ke akhir. List juga dapat menampung data heterogen.

;; Kontruksi lists
'(1 2 3 4 5)
;; => (1 2 3 4 5)
 
(list 1 2 3 4 5)
;; => (1 2 3 4 5)
 
;; Heterogen
'(:a 1 #(+ % %2) "kakak tua")
;; => (:a 1 (fn* [p1__1212# p2__1213#] (+ p1__1212# p2__1213#)) "kakak tua")
 
(= '(1 2 3 4 5) (list 5 4 3 2 1))
;; => false
 
(= '(1 2 3 4 5) [1 2 3 4 5])
;; => true
 
(= (class '(1 2 3)) (class [1 2 3]))
;; => false

Maps

Maps jika dalam Python disebut dengan Dictonary, atau dalam JavaScript disebut dengan associative array. Tipe data Maps, memetakan key terhadap value.

;; Hash maps
{:language "Clojure" :creator "Rich Hickey"}
;; => {:language "Clojure", :creator "Rich Hickey"}
 
(sorted-map :language "Clojure" :creator "Rich Hickey")
;; => {:creator "Rich Hickey", :language "Clojure"}
 
(array-map :language "Clojure" :creator "Rich Hickey")
;; => {:creator "Rich Hickey", :language "Clojure"}

Sets

Set adalah tipe data yang hanya membolehkan satu kemunculan untuk setiap element. Artinya Set memiliki element yang unik. Set tidak memerhatikan urutan. Sifat Set dalam Clojure sama seperti Set pada Matematika.

;; Sets construction
#{1 2 3}
;; => #{1 2 3}
 
(= #{1 2 3} #{3 2 1})
;; => true

Sequences

Pertama saya belajar Clojure, saya tidak bisa membedakan yang mana Collections, yang mana Sequences. Tetapi, jawaban di StackOverflow berikut membuat saya tahu apa bedanya.

The collection abstraction is closely related to the sequence abstraction. All of Clojure’s core data structures — vectors, maps, lists and sets — take part in both abstractions.

The abstractions differ in that the sequence abstraction is “about” operating on members individually while the collection abstraction is “about” the data structure as a whole. For example, the collection functions count, empty?, and every? aren’t about any individual element; they’re about the whole.

Intinya, Sequence dan Collection adalah abstraksi, bukan fisikal. Yang membedakan Collections dengan Sequences adalah pada fungsi terhadap element-nya, dimana abstraksi Collections fungsinya berlaku untuk seluruh element, sedangkan Sequences fungsinya tidak berlaku untuk seluruh element-nya.

;; Vectors
(coll? [1 2 3 4 5])
;; => true
(seq? [1 2 3 4 5])
;; => false
 
;; Lists
(coll? '(1 2 3 4 5))
;; => true
(seq? '(1 2 3 4 5))
;; => true
 
;; Maps
(coll? {:a 1 :b 2 :c 3}) 
;; => true
(seq? {:a 1 :b 2 :c 3})
;; => false
 
;; Sets
(coll? #{1 2 3 4 5})
;; => true
(seq? #{1 2 3 4 5})
;; => false

Untuk fungsi pada Collections dan Sequences sendiri sangat banyak. Saya belum hampal semuanya, tetapi yang sering saya pakai biasanya map, conj, cons, interleave, for, apply, reduce, dll. Fungsi tersebut bisa dilihat di Clojure Cheat Sheet.

Semoga bermanfaat! keep LISP-ing and stay cool!

Bacaan lanjutan:
http://www.brainonfire.net/files/seqs-and-colls/main.html

{ 1 comment… add one }

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.