Skip to content

Instantly share code, notes, and snippets.

@tlonist-sang
Last active March 29, 2022 07:59
Show Gist options
  • Save tlonist-sang/c3f1ecd158177b19e2eca52108c082ef to your computer and use it in GitHub Desktop.
Save tlonist-sang/c3f1ecd158177b19e2eca52108c082ef to your computer and use it in GitHub Desktop.
(ns data-structure
(:import (clojure.lang ISeq)))
;;;; 질문들
;;; [Programming to Abstractions] 왜 map 함수에 vector를 넣었는데 list가 나오는가?
;;; map 함수는 주어진 collection이 vector, list, map, set 인지 상관하지 않는다. 모든것은 sequence 의 구현이기 때문!
;;; sequence = collection + orderliness (having a before and after relationship)
;;; core sequence functions = first, rest, cons ISeq 을 검색 (first, next, more, cons) 여기서 more + next가 rest
;;; sequence와 seq의 차이는 비어있는 collection에 대해서 nil을 반환하느냐(seq) 아니냐 (sequence)
(sequence '())
(seq [])
(map str ["a" "b" "c"] ["A" "B" "C"])
(list (str "a" "A") (str "b" "B") (str "c" "C"))
;;; drop-while, take-while, take, drop
(def test-coll (take 100 (iterate (fn [_] (rand-int 100)) (rand-int 100))))
(take 10 (iterate (fn [_] (rand-int 100)) (rand-int 100)))
(drop 10 test-coll)
(take-while #(> % 27) test-coll) ; 첫번째 만족하는 조건에서 멈춤. n개를 찾고 싶다면 filter + take
(->> (iterate (fn [_] (rand-int 100)) (rand-int 100))
(filter #(> % 27))
(take 10))
;;; 헷갈리는 seq 관련 함수 모음
;;; seq? seqable? sequential? seq sequence
;;;; seq? = ISeq을 구현하고 있으면 true, 아니면 false.
(seq? [1 2 3 4]) ; false, PersistentVector -> extends APersistentVector -> implements Afn. 리스트의 첫번째 인자로 호출 가능
(seq? #{1 2 3 4}) ; false, PersistentHashSet -> extends APersistentHashSet -> implements Afn. 호출 가능
(seq? '(1 2 3 4)) ; true, PersistentList -> extends ASeq -> implements ISeq. 첫번째 인자에서 호출 불가능 ('(1 2 3) 1) => ERROR
(seq? {1 2 3 4}) ; false, PersistentArrayMap -> extends APersistentMap -> extends Afn -> Implements Afn. 호출 가능
(class [1 2 3 4]) ; => clojure.lang.PersistentVector
(class #{1 2 3 4}) ; => clojure.lang.PersistentHashSet
(class '(1 2 3 4)) ; => clojure.lang.PersistentList
(class {1 2 3 4}) ; => clojure.lang.PersistentArrayMap
;;; vector, set, map은 ISeq 을 `직접` 구현하고 있지 않기 때문에 (seq? %)의 결과가 false.
;;; 하지만 간접적으로 APersistentVector 등에서 first, next, more, cons 를 구현하고 있기 때문에 map 연산 시 (seq %)로 변환되어 평가될 수 있는 것이다.
;;;; seqable?
(seqable? [1 2 3 4])
;;; (canSeq x)
;;; coll instanceof ISeq || coll instanceof Seqable || coll == null || coll instanceof Iterable || coll.getClass().isArray() || coll instanceof CharSequence || coll instanceof Map;
;;; sequence가 될 수 있는 자료구조인가? 를 묻고 있음.
(seqable? #{1 2 3 4}) ; true
(seqable? {1 2 3 4}) ; true
(seqable? '(1 2 3 4)) ; true
(seqable? "1 2 3 4") ; true!! (instanceOf CharSequence 이기 때문)
(seqable? \c) ; false
(seqable? 123.123) ; false
;;;; sequential?
;;; (instance? clojure.lang.Sequential coll)) 클로저 Sequential을 구현했는가의 여부를 따짐
(sequential? [1 2 3 4])
;;; PersistentVector true
;;; PersistentList true
;;; PersistentHashSet false
;;; PersistentHashMap false
;; collection
;; IPersistentCollection을 구현하는가?
;; public interface IPersistentCollection extends Seqable {
;; int count();
;; IPersistentCollection cons(Object o);
;; IPersistentCollection empty();
;; boolean equiv(Object o);
;; }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment