Last active
March 29, 2022 07:59
-
-
Save tlonist-sang/c3f1ecd158177b19e2eca52108c082ef to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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